Ранее я спрашивал , как отменить событие 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 ...
MessageBox: Продолжить и отменить несохраненные изменения? ОК / Отмена http://img25.imageshack.us/img25/141/discard2yk0.gif
Если я затем выберу Отмена, он отменяется.
Однако, если я вместо этого выберу OK, чтобы отменить мои несохраненные изменения, тогда он все равно отменится - даже если e.Handled = False. Он не продолжается и выполняет TreeViewThings_Selected ().
Я думаю, что тот факт, что есть MessageBox, как-то облажается.
Что я делаю не так?