Ранее я спрашивал , как отменить событие WPF TreeViewItem.Selected а>.
Ответившие предложили вместо этого обработать событие PreviewMouseDown еще до того, как произойдет выбор. В этом есть смысл.
Я пытался это сделать ...
XAML ...
<TreeView Name="TreeViewThings"
...
PreviewMouseDown="TreeViewThings_PreviewMouseDown"
TreeViewItem.Expanded="TreeViewThings_Expanded"
TreeViewItem.Selected="TreeViewThings_Selected" >
Visual Basic...
Sub TreeViewThings_PreviewMouseDown(...) If UnsavedChangesExist() Then e.Handled = UserCancelled() Else e.Handled = False End If End Sub Function UnsavedChangesExist() As Boolean ... End Function Function UserCancelled() As Boolean Return MessageBox.Show("Discard your unsaved changes?", _ "Unsaved Changes", _ MessageBoxButton.OKCancel, _ MessageBoxImage.Question) = MessageBoxResult.Cancel End Function
Это только вроде работает ...
- Если несохраненных изменений нет, то все идет нормально и выполняет TreeViewThings_Selected ().
Если есть несохраненные изменения, я вижу MessageBox ...
http://img25.imageshack.us/img25/141/discard2yk0.gif
Если я затем выберу «Отмена», он будет отменен.
Однако, если вместо этого я выберу «ОК», чтобы отменить несохраненные изменения, он все равно будет отменен, даже если e.Handled = False. Он не продолжает работу и выполняет TreeViewThings_Selected ().
Я думаю, что тот факт, что есть MessageBox, как-то портит дело.
Что я делаю неправильно?