如何正确处理带有 MessageBox 确认的 PreviewMouseDown 事件?

2023-12-01

早些时候我问过如何取消 WPF TreeViewItem.Selected 事件.

回答者建议我在选择发生之前处理 PreviewMouseDown 事件。这就说得通了。

我已经尝试这样做了...

XAML...

<TreeView Name="TreeViewThings"
    ...
    PreviewMouseDown="TreeViewThings_PreviewMouseDown"
    TreeViewItem.Expanded="TreeViewThings_Expanded"
    TreeViewItem.Selected="TreeViewThings_Selected" >

视觉基础...



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 的事实不知何故搞砸了。

我究竟做错了什么?


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何正确处理带有 MessageBox 确认的 PreviewMouseDown 事件? 的相关文章

随机推荐