用于确认Datepicker问题的Messagebox弹出窗口

时间:2010-03-11 03:48:09

标签: silverlight data-binding datepicker silverlight-2.0 messagebox

我在Silverlight 2中使用vanilla 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

任何想法或解决方法?

2 个答案:

答案 0 :(得分:1)

实际上,这并非罕见。我的一位同事最近在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

但要记住以下几点:

  • MessageBox.Show在Silverlight中是唯一的,因为它是创建模式对话框的唯一方法之一。与消息循环仍在运行的Windows窗体不同,Silverlight的UI线程会一直停止,直到它返回。
  • 事件已在日期更改后发生,因此这不是确认更改的好方法。粗略地浏览文档表明没有相应的“改变”事件。
  • 根据具体情况,您可能最好使用ChildWindow而不是MessageBox。这不会有你描述的问题,因为虽然它似乎是一个模态对话框,但它不是。

答案 1 :(得分:0)

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