我的场景经过简化:我有一个包含员工行的 ListView,在每个员工行中,都有“增加”和“减少”按钮来调整他的工资。
假设在我的程序中,双击“员工”行意味着“解雇此人”。
The problem是当我快速单击“增加”时,这会触发 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;
}
启动该程序并双击列出的按钮后,both消息框按顺序显示。 (此外,此后按钮卡在向下位置。)
作为“修复”我can,在 ListViewItem 处理程序上,检查附加到事件的可视树并检查“某处有一个按钮”,从而丢弃该事件,但这是最后的手段。在编写这样的拼凑代码之前,我至少想了解这个问题。
有人知道吗whyWPF 就是这样做的,并且有一种优雅的惯用方式来避免这个问题吗?