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

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

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

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

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

Любые идеи или обходные пути?


person Wilson    schedule 11.03.2010    source источник


Ответы (2)


Хм, это не так уж и редкость на самом деле. Мой коллега недавно столкнулся с очень странными проблемами в приложении 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. У этого не было бы проблем, которые вы описали, потому что, хотя это выглядит как модальный диалог, это не так.
person Josh    schedule 11.03.2010
comment
Комбинация ваших двух предложений выше привела меня куда-то. Если вы нажмете вызов MessageBox на диспетчера, это не решит проблему. Если открыть дочернее окно, подобное описанному в этом блоге, — wintellect.com/CS/blogs/jprosise/archive/2009/04/29/ Вы обнаружите, что у вас будет такая же проблема, как если бы вы открыли MessageBox . Тем не мение! Если вы открываете дочернее окно в диспетчере, все в порядке. Спасибо за вашу помощь. - person Wilson; 12.03.2010

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

person JBrooks    schedule 26.12.2012