Wpf остановить событие маршрутизации, когда появится MessageBox?
Я PreviewMouseDown
событие на TreeView, чтобы определить, может ли пользователь выбрать другой элемент на основе некоторой логики. Если данные текущего элемента изменились, появится MessageBox, который спросит пользователя, хочет ли он отменить изменения. если пользователь нажмет ДА, я установлю e.Handled = false;
включить новый выбор. и если пользователь нажмет НЕТ, я установлю e.Handled = true;
отменить новый выбор.
Проблема в том, что хотя я установил e.Handled = false
, остановка события и событие выбора не происходит в TreeView. У кого-то есть решение для этого?
Заранее спасибо!
2 ответа
Изменение фокуса на окно сообщения отменяет событие мыши, поэтому не имеет значения, обрабатывается оно или нет. Поскольку вы знаете, какой элемент пользователь пытался выбрать, прежде чем отобразить окно сообщения, просто выберите этот элемент программным способом, если пользователь нажимает YES.
Я понимаю, что это старый вопрос, но я решил добавить свой ответ.
На самом деле, @yossharel, вы действительно знаете, какой элемент пользователь пытался выбрать из MouseEventArgs. Вам нужно взглянуть на e.OriginalSource (вероятно, TextBlock), на который пользователь нажал. Как таковой, он имеет DataContext.
Итак, установите SelectedItem TreeView равным e.OriginalSource.DataContext.
В VB вы можете быть явным или неявным: myTreeView.SelectedItem = CType(e.OriginalSource, TextBlock).DataContext() myTreeView.SelectedItem = e.OriginalSource.DataContext()
В C# вам нужно будет определить тип e.OriginalSource. Сделайте это, поставив точку останова, и посмотрите, что Studio говорит вам, что это так. В этом примере: myTreeView.SelectedItem = ((TextBlock)e.OriginalSource).DataContext()
Вот пример из моего собственного кода. В моем случае это DataGrid вместо TreeView, но он должен работать так же. Я использую этот код, чтобы подсказать пользователю, есть ли несохраненные изменения в выбранном элементе. Если пользователь отвечает "Да" на "Продолжить без сохранения?" код продолжается с новым выбором. В противном случае я позволяю окну сообщений блокировать RoutedEvent, предотвращая запуск события SelectionChanged.
Private Sub dgDataGrid_PreviewMouseLeftButtonDown(sender As Object, e As System.Windows.Input.MouseButtonEventArgs) Handles dgDataGrid.PreviewMouseLeftButtonDown
If dgDataGrid.SelectedItem IsNot Nothing Then
If MyDataContext.ExternalViewModel.ItemIsModified Then
Dim prompt As String = String.Format("Changes have not been saved.{0}{0}Continue without saving?", vbCrLf)
Dim title As String = "Changes Not Saved"
Dim result As MsgBoxResult = MsgBox(prompt, MsgBoxStyle.Exclamation Or MsgBoxStyle.YesNo, title)
If result = MsgBoxResult.Yes Then
dgDataGrid.SelectedItem = e.OriginalSource.DataContext()
End If
End If
End If
End Sub
Private Sub dgDataGrid_SelectionChanged(sender As System.Object, e As System.Windows.Controls.SelectionChangedEventArgs) Handles dgDataGrid.SelectionChanged
MyDataContext.SetSearchItem(dgDataGrid.SelectedItem)
End Sub