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

е я спрашивалакак отменить событие 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, как-то облажался.

Что я делаю неправильно?

Ответы на вопрос(1)

Ваш ответ на вопрос