我的情况比较简单:我有一个包含雇员行的ListView,每个雇员行中都有“增加”和“减少”按钮来调整他的薪水。
假设在我的程序中,双击一个雇员行意味着“解雇这个人”。
问题是,在我快速点击“增加”按钮时,这会触发ListViewItem的双击事件。当然,我只是想增加他们的工资,而不是解雇他们。
根据其他所有事件的工作方式,我希望能够通过在事件上设置Handled=true
来解决此问题。然而,这并不起作用。在我看来,WPF生成了两个完全不相关的双击事件。
以下是重现我的问题所需的最小示例。可见的组件:
<ListView>
<ListViewItem MouseDoubleClick="ListViewItem_MouseDoubleClick">
<Button MouseDoubleClick="Button_MouseDoubleClick"/>
</ListViewItem>
</ListView>
处理程序代码:
private void Button_MouseDoubleClick(object s, MouseButtonEventArgs e) {
if (!e.Handled) MessageBox.Show("Button got unhandled doubleclick.");
e.Handled = true;
}
private void ListViewItem_MouseDoubleClick(object s, MouseButtonEventArgs e) {
if (!e.Handled) MessageBox.Show("ListViewItem got unhandled doubleclick.");
e.Handled = true;
}
运行此程序并双击列出的按钮后,两个消息框按顺序显示。(此外,此按钮在此之后处于按下状态。)
作为一个“修复”,在ListViewItem处理程序中,我可以检查事件附加的可视树,并检查“是否有一个按钮存在其中”,从而丢弃该事件,但这是最后的手段。在编写这样的补丁之前,我希望至少了解问题。
有人知道WPF为什么会这样做,以及避免此问题的一种优雅的惯用方法吗?