簡略化した私のシナリオ: 従業員の行を含む ListView があり、各従業員の行には、給与を調整する「増加」および「減少」ボタンがあります。
私のプログラムで、従業員の行をダブルクリックすると、「この人を解雇する」ことを意味するとします。
問題は、「増加」をすばやくクリックしているときに、ListViewItem でダブルクリック イベントがトリガーされることです。当然のことながら、給料を上げているだけで人を解雇したくはありません。
他のすべてのイベントがどのように機能するかによると、イベントを設定することでこれを解決できると期待してHandled=true
います。ただし、これは機能しません。WPF は、完全にリンクされていない 2 つの別個のダブルクリック イベントを生成するように思われます。
以下は、私の問題を再現するための最小限の例です。目に見えるコンポーネント:
<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がこれを行う理由と、問題を回避するためのエレガントな慣用的な方法を知っている人はいますか?