Мой сценарий упрощен: у меня есть ListView, содержащий строки сотрудников, и в каждой строке сотрудников есть кнопки «Увеличить» и «Уменьшить», регулирующие его зарплату.
Представьте, что в моей программе двойной щелчок по строке «Сотрудник» означает «уволить этого человека».
Проблема заключается в том, что, когда я быстро нажимаю «Увеличить», это вызывает событие двойного щелчка на 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 проверить визуальное дерево, прикрепленное к событию, и проверить, что «там» где-то там есть кнопка "и таким образом отмените событие, но это последнее средство. Я хочу хотя бы разобраться в проблеме, прежде чем кодировать такой кладж.
Кто-нибудь знает , почему WPF делает это, и элегантный идиоматический способ избежать проблемы?