Мой сценарий, упрощенный: у меня есть ListView, содержащий строки Employees, и в каждой строке 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 делает это, и элегантный идиоматический способ избежать проблемы?