Mi situación, simplificada: tengo un ListView que contiene filas de empleados, y en cada fila Empleado, hay botones "Aumentar" y "Disminuir" para ajustar su salario.Los eventos MouseDoubleClick no hacen burbujas
Supongamos que en mi programa, al hacer doble clic en una fila de empleado significa "despedir a esta persona".
El problema es que mientras hago clic en "Aumentar" rápidamente, esto desencadena un evento de doble clic en ListViewItem. Naturalmente, no quiero despedir personas cuando solo estoy aumentando su salario.
De acuerdo con el funcionamiento de todos los demás eventos, espero poder resolver esto configurando Handled=true
en el evento. Esto, sin embargo, no funciona. Me parece que WPF genera dos eventos de doble clic separados y completamente desvinculados.
El siguiente es un ejemplo mínimo para reproducir mi problema. Los componentes visibles:
<ListView>
<ListViewItem MouseDoubleClick="ListViewItem_MouseDoubleClick">
<Button MouseDoubleClick="Button_MouseDoubleClick"/>
</ListViewItem>
</ListView>
Y el código del controlador:
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;
}
Después de disparar este programa y haga doble clic en el botón de la lista, ambos cuadros de mensajes aparecen en secuencia. (Además, el botón está atascado en la posición hacia abajo después de esto.)
como una "solución" Me puedo, en el manejador de ListViewItem, inspeccionar el árbol visual adjunta al evento y comprobar que "hay un botón allí en algún lugar "y así descartar el evento, pero este es un último recurso. Al menos quiero entender el problema antes de codificar tal kludge.
¿Alguien sabe por qué WPF hace esto, y una elegante manera idiomática para evitar el problema?
Gracias, pero tampoco puedo hacer que encaje bien. Un controlador para MouseDown/MouseLeftButtonDown en Button (o en un contenedor contenedor alrededor de Button) nunca se desencadena, por lo que parece que el evento ya está 'Handled' by Button. Además, no puedo inferir clics dobles de MouseDown/MouseLeftButtonDown en ListViewItem, ya que estos eventos son manejados y tragados por otros componentes visuales en los contenidos ListViewItem (como cuadros de texto). – Deestan