1

Я использую vanil datepicker в Silverlight 2. Я привязываю выбранную дату к значению, и когда это значение изменяется, я вывожу сообщение, чтобы подтвердить, что они хотели бы изменить значение.Messagebox Popup to Confirm Datepicker Issue

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

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

ответ

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

Комбинация ваших двух предложений выше меня достала. Если вы нажмете вызов MessageBox на диспетчер, это не решит проблему. Если вы поместите дочернее окно, похожее на этот блог, описано: http://www.wintellect.com/CS/blogs/jprosise/archive/2009/04/29/silverlight-3-s-new-child-windows .aspx Вы обнаружите, что у вас будет аналогичная проблема, как если бы вы нажали MessageBox. Однако! Если вы поместите дочернее окно в диспетчер, все будет хорошо. Спасибо за помощь. – Wilson

0

У меня возникло обходное решение HERE, которое делает ненужным окно сообщения, изменяя рабочий процесс.