Как правильно обработать событие PreviewMouseDown с подтверждением MessageBox?

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

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


person Zack Peterson    schedule 12.02.2009    source источник
comment
Вы прошли через обработчик опускания мыши предварительного просмотра в отладчике, чтобы убедиться, что он работает так, как вы ожидали? Вы должны увидеть, установлено ли для e.Handled значение true / false и когда. Если это так, значит, проблема в коробке.   -  person Josh G    schedule 13.02.2009
comment
Я перешагнул через отладчик. e.Handled устанавливается должным образом. Я не знаю почему, но проблема в самом MessageBox.   -  person Zack Peterson    schedule 13.02.2009
comment
Я задал дополнительный вопрос: stackoverflow.com / questions / 546388 /   -  person Zack Peterson    schedule 13.02.2009


Ответы (1)


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

person Bret Faller    schedule 17.09.2010