2010-03-04 11 views
9

La literatura es horrible en este aspecto; todo lo que quiero hacer es crear un evento desde un control que he definido pero creado sobre la marcha (espero que esto no cause problemas) desde una clase de controlador de intermediario. El control es PopUp.Stumped - borboteando un camino hasta la ventana superior en WPF - ¡cómo capturar en cualquier lugar!

public static readonly RoutedEvent weClosed = EventManager.RegisterRoutedEvent("TIMBOO", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(FixedTaskbarNotifier)); 


    // Provide CLR accessors for the event 
    public event RoutedEventHandler TIMBOO 
    { 
     add { AddHandler(weClosed, value); } 
     remove { RemoveHandler(weClosed, value); } 
    } 

    // This method raises the Tap event 
    void RaiseTapEvent() 
    { 
     RoutedEventArgs newEventArgs = new RoutedEventArgs(weClosed); 
     RaiseEvent(newEventArgs);} 


    protected override void OnClosed(EventArgs e) 
    { 
     //TO DO - rearrange current open windows - fire event? 
     Log.Instance.Info("Clean up Window"); 
     RaiseTapEvent(); This is called on close but nothing fires .. 
       } 

Espero ver el evento en alguna parte, incluso en mi ventana principal o más arriba en el árbol visual. Esto tiene una referencia a un controlador que contiene la lista de controles de notificación: una vez que sé cuál fue cerrado, puedo regrabar/volver a pintar cualquier otro que esté activo a través del controlador, pero ¿cómo atraparlo? Gracias!

Respuesta

2

En su padre, o donde quiera que lo quiera manejar, simplemente debe ser capaz de manejar el evento al declarar en qué clase está declarado y el nombre del evento. En su caso, en su declaración de la ventana, hacer:

<Window ... FixedTaskbarNotifier.TIMBOO="<EventHandlerName>"> 

Esto cogerá todos los eventos burbujear hasta que no se hayan cancelado (e incluso se puede conseguir esos, si lo desea, aunque creo que no se considera una buena práctica).

Como un ejemplo simple, cree una ventana y coloque un botón en ella. En la ventana, agregar un controlador para la operación de clic (que se define en ButtonBase)

<Window ... ButtonBase.Click="Window_Click"> 

Esto luego el fuego cada vez que se hace clic en cualquier botón del niño, incluso en el interior de los controles secundarios y tal, a menos que el evento es intencional cancelado.

4

Acepto, la documentación sobre burbujeo/tunelización en MSDN no es genial en absoluto.

He encontrado este artículo de la revista MSDN "Understanding Routed Events and Commands In WPF" mucho mejor para explicar los eventos de burbujeo.

Busca la sección "Evento de enrutamiento", copia pegada a continuación:

Evento enrutamiento

Entendiendo un poco sobre los árboles lógicas y visuales es importante porque los eventos enrutados consiguen enrutan basan principalmente en el árbol visual . Los eventos enrutados admiten RoutingStrategy of Bubble, Tunnel o Direct.

Burbuja es la más común y significa que un evento de burbujas (propagar) hasta el árbol visual de el elemento de origen hasta que se ha manejado o que llegue a la elemento raíz. Esto le permite manejar un evento en un objeto más arriba en la jerarquía de elementos del elemento fuente . Por ejemplo, puede adjuntar un botón. Haga clic en el controlador en el elemento de cuadrícula que se incluye en lugar de directamente en el botón. Los eventos de burbuja solo tienen nombres que indican su acción (por ejemplo, MouseDown).

eventos Túnel van en la otra dirección , a partir de la elemento raíz y atravesando el árbol elemento hasta que se manipulan o llegan al elemento de origen para el evento . Esto permite que los elementos ascendentes intercepten el evento y lo manejen antes de que el evento llegue al elemento fuente . Los eventos de túnel tienen sus nombres con el prefijo Previo por convención (como PreviewMouseDown).

Los eventos directos se comportan como los eventos normales en .NET Framework. El único controlador potencial para el evento es un delegado que está conectado al evento .

Normalmente, si un evento de túnel es definido para un evento en particular, existe es un evento de burbuja correspondiente. En el caso ese caso, el evento Túnel dispara primero , comenzando desde la raíz y hasta llegar al elemento fuente en busca de un controlador. Una vez que se ha manejado o ha llegado al elemento fuente , el evento Bubble está disparado, subiendo desde el elemento fuente y buscando un controlador . Un evento Bubble o Tunnel no no detiene su enrutamiento solo porque se llama a un controlador de eventos . Si quieres para detener la formación de burbujas o el proceso de construcción de túneles , se marca el evento como maneja en el controlador de eventos utilizando el evento argumentos que se pasan:

private void OnChildElementMouseDown(object sender, MouseButtonEventArgs e) { e.Handled = true; } 

Una vez que su manejador marca un evento como manejado, no se elevará a ningún más controladores. Bueno, eso es solo parcialmente cierto. En realidad, el evento enrutamiento continúa detrás de las escenas, y se puede conectar explícitamente eventos manipuladores de código con una anulación de los el método UIElement.AddHandler que tiene una bandera adicional para efectivamente decir, "Me llaman, incluso si el evento tiene marcado como manejado ". Se especifica que marca con una llamada como la siguiente:

m_SomeChildElement.AddHandler(UIElement.MouseDownEvent, (RoutedEventHandler)OnMouseDownCallMeAlways,true); 

El primer parámetro a AddHandler es la RoutedEvent desea manejar. El segundo es un delegado al método de manejo de eventos (que necesitará para tener la firma correcta para el delegado del evento ). El tercer parámetro indica si desea que se le notifique , incluso si otro controlador tiene marcó el evento como manejado. El elemento al que llama AddHandler es el que va a estar atento al evento durante el enrutamiento.

Espero que esto ayude.

Cuestiones relacionadas