1

我在Silverlight 2中使用了vanilla datepicker。我将选定的日期绑定到一个值,当该值更改时,弹出一个消息框以确认他们想要更改值。Messagebox Popup确认日期选择器问题

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

此外,发生这种情况后,它似乎影响绑定,并且它不能再次设置视图模型的属性,直到页面重新加载。

这个问题是比较特殊的,所以我附上了一个精简的例子。选择一个日期并按OK,然后将鼠标移动到日历上以重现此操作。

我的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 

任何意见或解决方法?

回答

1

嗯,这其实并不罕见。我的一位同事最近在Windows Forms应用程序中遇到了非常奇怪的问题,因为他使用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。这不会有你描述的问题,因为虽然它似乎是一个模态对话框,但事实并非如此。
+0

上述两个建议的组合让我处于某个地方。 如果将MessageBox调用推送到调度程序,那不能解决问题。 如果您弹出类似于此博客描述的子窗口 - http://www.wintellect.com/CS/blogs/jprosise/archive/2009/04/29/silverlight-3-s-new-child-windows .aspx 你会发现你会遇到类似的问题,就像弹出一个MessageBox一样。 但是!如果你在调度员上弹出一个子窗口,一切都很好。 感谢您的帮助。 – Wilson 2010-03-11 21:56:16

0

我写了一个解决方法HERE,通过改变工作流程使消息框变得不必要。