سؤال

أنا أستخدم الفانيليا DatePicker في Silverlight 2. أرتدي التاريخ المحدد إلى قيمة، وعندما يتغير قيمة القيمة التي أقوم بتبول رسالة message إلى تأكيد أنها ترغب في تغيير القيمة.

ومع ذلك، فإن السلوك الغريب لا يلزم عند استخدام صندوق Message مباشرة بعد تغيير قيمة DatePicker. لن يغلق المنبثقة منبثقة DatePicker، وإذا كنت الماوس فوق التقويم، فسيختار تاريخا دون الاضطرار إلى النقر فوق الماوس.

أيضا، بعد حدوث ذلك، يبدو أنه يؤثر على الروابط ولا يمكنه تعيين خاصية عرض الطراز مرة أخرى حتى يتم إعادة تحميل الصفحة.

هذه المشكلة محددة إلى حد ما، لذا قمت بإرفاق مثال تم تجريده. اختر تاريخا واضغط على موافق، ثم حرك الماوس فوق التقويم لإعادة إنتاج هذا.

بلدي xaml -

<Grid x:Name="LayoutRoot">
    <controls:DatePicker x:Name="dpTest" 
                         Height="25" 
                         Width="75" 
                         SelectedDateChanged="DatePicker_SelectedDateChanged" />
</Grid>

رمزي خلف -

  Private Sub DatePicker_SelectedDateChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs)
    MessageBox.Show("Test Popup")
End Sub

أي أفكار أو حلول؟

هل كانت مفيدة؟

المحلول

هم هذا ليس كل ما غير شائع في الواقع. ركض زميل العمل من الألغام مؤخرا إلى مشكلات غريبة للغاية في تطبيق نماذج Windows لأنه كان يستخدم MessageBox استجابة لحدث Click Control في قائمة الطرف الثالث (قبل أن يتم رفض القائمة.)

اقتراح واحد لم يعمل من أجله ولكن قد يعمل بشكل جيد للغاية بالنسبة لك هو "دفع" الدعوة إلى المرسل. بهذه الطريقة سوف يعود معالج الخاص بك المنحنى قبل يتم عرض مربع الرسالة في الواقع.

Private Sub DatePicker_SelectedDateChanged( ... )

    ' Unfortunately my VB is rusty '
    ' I believe this is the correct syntax. '
    Dispatcher.BeginInvoke(AddressOf ShowDateMessage)

    ' At this point, the message box has *not* been shown '
    ' It will be shown once control returns to the dispatcher '

End Sub

Private Sub ShowDateMessage()

    ' By this point, the DatePicker popup should be closed '
    ' so hopefully the issues you are seeing would be avoided '
    MessageBox.Show("Test Popup")

End Sub

بضعة أشياء يجب مراعاتها على الرغم من:

  • MessageBox.Show فريد من نوعه في Silverlight في أنه أحد الطرق الوحيدة لإنشاء حوار مشروط. وعلى عكس نماذج Windows حيث لا يزال حلقة الرسائل قيد التشغيل، يتم إيقاف مؤشر ترابط Silverlight's UI حتى يعود.
  • يحدث الحدث بالفعل بعد تغيير التاريخ، لذلك هذه ليست طريقة جيدة لتأكيد التغيير. تشير لمحة سريعة في المستندات إلى عدم وجود حدث "متغير" المقابل.
  • اعتمادا على الظروف، قد تكون أفضل حالا في استخدام Childwindow بدلا من صندوق الرسائل. لن يكون لهذا المشكلات التي وصفتها لأنه بينما يبدو أنه مربع حوار مشروط، فهذا ليس كذلك.

نصائح أخرى

قمت بلوجت الحل البديل هنا التي تجعل مربع الرسالة غير ضروري عن طريق تغيير تدفق العمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top