Всплывающее окно Messagebox для подтверждения проблемы с выбором даты

StackOverflow https://stackoverflow.com/questions/2422406

Вопрос

Я использую ванильный datepicker в Silverlight 2.Я привязываю выбранную дату к значению, и когда это значение изменяется, я открываю окно сообщения, чтобы подтвердить, что они хотели бы изменить значение.

Однако странное поведение возникает, когда я использую messagebox сразу после изменения значения datepicker .Всплывающее окно выбора даты не закроется, и если вы наведете курсор мыши на календарь, он выберет дату без необходимости щелкать мышью.

Кроме того, после того, как это происходит, это, по-видимому, влияет на привязки, и он не может снова установить свойство view model до тех пор, пока страница не будет перезагружена.

Эта проблема довольно специфична, поэтому я приложил сокращенный пример.Выберите дату и нажмите 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

Есть какие-нибудь идеи или обходные пути?

Это было полезно?

Решение

Хм, на самом деле это не такая уж редкость.Мой коллега недавно столкнулся с очень странными проблемами в приложении 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 Forms, где цикл сообщений все еще выполняется, поток пользовательского интерфейса Silverlight останавливается до тех пор, пока он не вернется.
  • Событие уже происходит после изменения даты, так что это не очень хороший способ подтвердить изменение.Беглый взгляд на документы наводит на мысль, что соответствующего события "Изменение" не существует.
  • В зависимости от обстоятельств, возможно, вам просто лучше использовать ChildWindow вместо MessageBox .У этого не было бы проблем, которые вы описали, потому что, хотя это выглядит как модальный диалог, это не так.

Другие советы

Я написал в блоге об обходном пути ЗДЕСЬ это делает окно сообщения ненужным, изменяя рабочий процесс.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top