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