我的场景,简化:我有一个包含员工行的 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为什么要这样做,以及避免该问题的优雅惯用方式?