Как правильно обработать событие PreviewMouseDown с подтверждением MessageBox? - PullRequest
2 голосов
/ 13 февраля 2009

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

1 голос
/ 17 сентября 2010

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

...