Wpf остановить событие маршрутизации, когда появится MessageBox? - PullRequest
5 голосов
/ 29 декабря 2010

У меня PreviewMouseDown событие в TreeView, чтобы определить, может ли пользователь выбрать другой элемент на основе некоторой логики. Если данные текущего элемента изменились, появится MessageBox, который спросит пользователя, хочет ли он отменить изменения. если пользователь нажимает YES, я устанавливаю e.Handled = false;, чтобы включить новый выбор. и если пользователь нажимает NO, я устанавливаю e.Handled = true;, чтобы отменить новый выбор.

Проблема в том, что, хотя я установил e.Handled = false, событие остановилось, и событие выбора не произошло в TreeView. У кого-то есть решение для этого?

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 29 декабря 2010

Изменение фокуса на окне сообщения отменяет событие нажатия мыши, поэтому не имеет значения, обрабатывается оно или нет. Поскольку вы знаете, какой элемент пользователь пытался выбрать, прежде чем отобразить окно сообщения, просто выберите этот элемент программным способом, если пользователь нажимает YES.

1 голос
/ 30 января 2012

Я понимаю, что это старый вопрос, но я подумал, что добавлю свой ответ.

На самом деле, @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
...