Всплывающее окно сообщения для подтверждения проблемы выбора даты - PullRequest
1 голос
/ 11 марта 2010

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

Однако странное поведение возникает, когда я использую окно сообщения сразу после изменения значения указателя даты. Всплывающее окно 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 ]

1 голос
/ 11 марта 2010

Хм, на самом деле это не так уж редко. Мой коллега недавно столкнулся с очень странными проблемами в приложении Windows Forms, потому что он использовал MessageBox в ответ на событие click элемента управления меню стороннего производителя (до того, как меню было закрыто).

Одно предложение, которое не сработало для него, но вполне может сработать для вас, - это «протолкнуть» вызов диспетчеру. Таким образом, ваш обработчик 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. Это не будет иметь проблемы, которые вы описали, потому что, хотя это кажется модальным диалогом, это не так.
0 голосов
/ 27 декабря 2012

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

...