如何使用MessageBox确认正确处理PreviewMouseDown事件?

时间:2009-02-12 21:18:16

标签: wpf treeview savechanges

早些时候我问how to cancel a WPF TreeViewItem.Selected event

回答者建议我在选择发生之前处理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: Continue and discard your unsaved changes? OK/Cancel http://img25.imageshack.us/img25/141/discard2yk0.gif

  • 如果我选择取消,它会取消。

  • 但是,如果我改为选择“确定”以丢弃未保存的更改,则无论如何它都会取消 - 即使e.Handled = False。它不会继续并执行TreeViewThings_Selected()。

我认为有一个MessageBox以某种方式将其搞砸了。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

问题是消息框导致树失去焦点。消息框解除后,您是否尝试将焦点设置回树?