2010-08-04 10 views

Respuesta

18

Imagine una ventana que contiene una jerarquía densa de controles secundarios. Ahora digamos que desea hacer algo, hay un clic derecho en cualquier lugar de su ventana.

  • Con eventos normales, tendría que manejar un evento Click para todos los controles, porque no está seguro de dónde podría hacer clic el usuario.
  • Con WPF routed events, los eventos "burbuja" o "túnel" (es decir, recorren el árbol de la UI o hacia abajo) si no encuentran un controlador de eventos, que "maneja" en el nivel actual. Por lo tanto, podría escribir un manejador para el evento de la ventana, es decir, TopLevel. (WPF tiene una convención de pares de eventos, PreviewXXX y XXX - el evento PreviewXXX se dispara primero y los túneles descienden desde la raíz al control que recibió el estímulo y el evento homólogo XXX luego sube desde control secundario a Root). Así que si hace clic en un botón, WPF se desplaza hacia arriba la jerarquía de la interfaz de usuario, la invocación de todos los manipuladores que encuentra (a menos que alguien se celebra el evento ha "manejado" en los argumentos del evento.)
+0

vista previa son túneles, no burbujeante. –

+1

@John - ¡Vaya! mi wpf se ha vuelto un poco oxidado. Gracias por la corrección ... actualizada. – Gishu

1

eventos enrutados son eventos con más " habilidades de viaje ', como se menciona en una respuesta Gishu. eventos enrutados están representados por una instancia de una clase RoutedEvent + evento .NET ordinaria, que lo envuelve:

public class MyClassWithARoutedEvent : UIElement 
    { 
     public static readonly RoutedEvent DoSomethingEvent; 

     public event RoutedEventHandler DoSomething 
     { 
      add { base.AddHandler (MyClassWithARoutedEvent.DoSomethingEvent, value); 
      remove { base.AddHandler (MyClassWithARoutedEvent.DoSomethingEvent, value); 
     } 
    } 

Se podría usar normalmente eventos promocionado en este tipo de situaciones:

  • implementar su propio control que sin problemas se integra con la infraestructura de WPF Proceso de sucesos
  • , disparadas por diferentes controles en una raíz común
  • tipo de comunicación entre los elementos en un árbol de elementos en la mayoría de situaciones que Wil Probablemente use la infraestructura de eventos enrutados sin siquiera darme cuenta.

Además, vale la pena mencionar que puede usar RoutedEvent en su control incluso si no lo define o incluso hereda de un elemento, lo que sí lo hace. Esto se debe a que realmente puede pensar en una instancia de RoutedEvent como un nombre sólido de un evento. Por lo tanto, si usted tiene un acceso a este 'nombre' (esta es la razón por una instancia de un evento enrutado generalmente se hace pública), puede deberse que: eventos

public class MyClassWithARoutedEvent : UIElement 
    { 
     public static readonly RoutedEvent ClickEvent; 
     static MyClassWithARoutedEvent () 
     { 
      ClickEvent = ButtonBase.ClickEvent.AddOwner(typeof (MyClassWithARoutedEvent)); 
     } 

     // A wrapper should be placed here as described above 
    } 
Cuestiones relacionadas