2011-06-09 22 views
9

He XAML siguiente¿Por qué e.Handled = true no funciona?

<StackPanel MouseEnter="StackPanel_MouseEnter" Height="130" Background="Blue"> 
    <Grid MouseEnter="Grid_MouseEnter" Height="60" Background="Red" > 
     <Button MouseEnter="Button_MouseEnter" Height="20"/> 
    </Grid> 
</StackPanel> 

En código detrás Estoy haciendo esto

private void StackPanel_MouseEnter(object sender, MouseEventArgs e) 
{ 

} 

private void Grid_MouseEnter(object sender, MouseEventArgs e) 
{ 
    e.Handled = true; 
} 

private void Button_MouseEnter(object sender, MouseEventArgs e) 
{ 
    e.Handled = true; 
} 

Ahora, incluso si muevo el cursor sobre Button y establecer e.Handled = true, los acontecimientos de Grid y StackPanel se llaman, respectivamente. ¿Por qué? ¿Qué debo hacer para evitar que el evento enrutado burbujee?

Respuesta

10

El evento MouseEnter no es un evento burbujeante, es un evento directo (como los eventos clásicos de CLR). Desde el documentation:

Se pueden definir varios MouseEnter eventos para los objetos de contenido XAML. Sin embargo, si un objeto secundario y su objeto primario definen un evento MouseEnter , el evento MouseEnter del objeto principal se produce antes del evento MouseEnter del objeto secundario. Este no es un caso de un evento de burbujeo; indica solo que el mouse (o stylus) ha ingresado ambos objetos, potencialmente en diferentes veces según el diseño y la composición del árbol visual.

Así que no puedes evitar que se dispare contra los padres. Puede usar la propiedad IsMouseDirectlyOver para ver si el mouse está de hecho solo sobre el elemento dado.

+1

En cuanto a la propuesta en su nombre de usuario, secundo el movimiento! – Qwertie

Cuestiones relacionadas