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