我的场景简化了:我有一个包含Employees行的ListView,并且在每个Employee行中都有按钮“Increase”和“Decrease”来调整他的薪水。MouseDoubleClick事件不会冒泡
假装在我的程序中,双击一个Employee行意味着“激发这个人”。
问题是当我点击“增加”时,这会触发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的处理程序,检查连接到该事件的可视化树,并检查“有一个按钮某处“,因此放弃该事件,但这是最后的手段。我想在编写这样一个kludge之前至少了解这个问题。
有没有人知道为什么 WPF做到了这一点,并采用了优雅的惯用方法来避免这个问题?
谢谢,但我无法完全符合这个要求。 Button上的MouseDown/MouseLeftButtonDown处理函数(或Button上的容器包装函数)永远不会被触发,所以看起来事件已经被按钮处理了。另外,我无法从ListViewItem的MouseDown/MouseLeftButtonDown中推断出双击,因为这些事件是由ListViewItem内容(如文本框)中的其他可视组件处理和吞食的。 – Deestan 2011-06-08 14:22:47