我的場景簡化了:我有一個包含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