Silverlight 确认日期选择器问题的Messagebox弹出窗口

Silverlight 确认日期选择器问题的Messagebox弹出窗口,silverlight,data-binding,datepicker,silverlight-2.0,messagebox,Silverlight,Data Binding,Datepicker,Silverlight 2.0,Messagebox,我正在使用Silverlight 2中的香草日期选择器。我将所选日期绑定到一个值,当该值更改时,我弹出一个消息框,确认他们想要更改该值 然而,当我在datepicker的值更改后直接使用messagebox时,会出现奇怪的行为。日期选择器的弹出窗口将不会关闭,如果您将鼠标悬停在日历上,它将选择一个日期,而无需单击鼠标 此外,发生这种情况后,它似乎会影响绑定,并且在重新加载页面之前,它无法再次设置视图模型的属性 这个问题相当具体,所以我附上了一个简单的例子。选择一个日期并按OK,然后将鼠标移到日历

我正在使用Silverlight 2中的香草日期选择器。我将所选日期绑定到一个值,当该值更改时,我弹出一个消息框,确认他们想要更改该值

然而,当我在datepicker的值更改后直接使用messagebox时,会出现奇怪的行为。日期选择器的弹出窗口将不会关闭,如果您将鼠标悬停在日历上,它将选择一个日期,而无需单击鼠标

此外,发生这种情况后,它似乎会影响绑定,并且在重新加载页面之前,它无法再次设置视图模型的属性

这个问题相当具体,所以我附上了一个简单的例子。选择一个日期并按OK,然后将鼠标移到日历上以重现该日期

我的XAML-

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

有什么想法或解决办法吗?

嗯,实际上这并不少见。我的一位同事最近在Windows窗体应用程序中遇到了非常奇怪的问题,因为他使用MessageBox响应第三方菜单控件的单击事件(在菜单被取消之前)

一个对他不起作用但对你可能很有效的建议是把电话“推”给调度员。这样,SelectedDateChanged处理程序将在消息框实际显示之前返回

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
但要记住以下几点:

  • Show在Silverlight中是独一无二的,因为它是创建模式对话框的唯一方法之一。与Windows窗体中的消息循环仍在运行不同,Silverlight的UI线程在返回之前一直处于暂停状态
  • 该事件已在日期更改后发生,因此这不是确认更改的好方法。粗略地看一下这些文档,就知道没有相应的“更改”事件
  • 根据具体情况,您最好使用ChildWindow而不是MessageBox。这不会有您描述的问题,因为虽然它看起来是一个模态对话框,但它不是

    • 嗯,事实上,这并不少见。我的一位同事最近在Windows窗体应用程序中遇到了非常奇怪的问题,因为他使用MessageBox响应第三方菜单控件的单击事件(在菜单被取消之前)

      一个对他不起作用但对你可能很有效的建议是把电话“推”给调度员。这样,SelectedDateChanged处理程序将在消息框实际显示之前返回

      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
      
      但要记住以下几点:

      • Show在Silverlight中是独一无二的,因为它是创建模式对话框的唯一方法之一。与Windows窗体中的消息循环仍在运行不同,Silverlight的UI线程在返回之前一直处于暂停状态
      • 该事件已在日期更改后发生,因此这不是确认更改的好方法。粗略地看一下这些文档,就知道没有相应的“更改”事件
      • 根据具体情况,您最好使用ChildWindow而不是MessageBox。这不会有您描述的问题,因为虽然它看起来是一个模态对话框,但它不是

      我在博客上写了一个变通方法,通过更改工作流程使消息框变得不必要。

      我在博客上写了一个变通方法,通过更改工作流程使消息框变得不必要。

      上面两个建议的结合让我有所收获。如果将MessageBox调用推送到dispatcher上,则无法解决问题。如果你弹出一个类似于本博客描述的子窗口,你会发现你会遇到类似于弹出MessageBox的问题。然而!如果在dispatcher上弹出一个子窗口,则一切正常。谢谢你的帮助。上面两个建议的结合让我有所收获。如果将MessageBox调用推送到dispatcher上,则无法解决问题。如果你弹出一个类似于本博客描述的子窗口,你会发现你会遇到类似于弹出MessageBox的问题。然而!如果在dispatcher上弹出一个子窗口,则一切正常。谢谢你的帮助。