События MouseDoubleClick не всплывают

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

18
задан Charles 17 June 2011 в 19:23
поделиться