Estrategias de enrutamiento de burbujeo y tunelización
Un evento enrutado es un evento que puede invocar controladores en varios agentes de escucha de un árbol de elementos, en lugar de solo en el objeto que generó el evento.
Un evento enrutado es un evento que puede invocar controladores en varios agentes de escucha de un árbol de elementos, en lugar de solo en el objeto que generó el evento. En palabras simples, los eventos enrutados son, básicamente, eventos enviados (lo que significa enrutados) de un control a otro, a través de la jerarquía de controles.
Cada evento enrutado tiene una estrategia de enrutamiento asociada, cuyo propósito es indicar al evento enrutado a dónde se debe enrutar y de qué manera.
En WPF, los eventos enrutados usan una de las tres estrategias de enrutamiento siguientes:
- Propagación: aquí, se invocan los controladores de eventos en el origen del evento. A continuación, el evento enrutado se enruta o se propaga a los elementos primarios sucesivos uno por uno hasta que llega a la raíz del árbol de elementos. La estrategia de enrutamiento burbujeante es la estrategia más utilizada.
- Examples of a bubbling event would be something like a
MouseButtonDownevent. Or aKeyDownevent. - Directo: Aquí, solo el propio elemento de origen tiene la oportunidad de invocar controladores en respuesta. Este comportamiento es similar a un evento normal de .NET.
- Tunelización: Al principio, se invocan controladores de eventos en la raíz del árbol de elementos. A continuación, el evento enrutado atraviesa los elementos secundarios sucesivos a lo largo de la ruta, hacia el elemento de nodo que es el origen del evento enrutado (el elemento que generó el evento enrutado).
Los eventos enrutados de propagación se usan normalmente para notificar cambios de entrada o estado de controles distintos u otros elementos de la interfaz de usuario, mientras que los eventos enrutados de tunelización se usan o controlan con frecuencia como parte de la composición de un control. Esto significa que los eventos de las partes compuestas se pueden suprimir o reemplazar deliberadamente por eventos que son específicos del control completo.
Los eventos de entrada proporcionados en WPF a menudo se implementan como un par de tunelización y propagación. Los eventos de tunelización también se denominan a veces eventos de vista previa, debido a una convención de nomenclatura que se utiliza para los pares.
Todos los eventos de propagación son eventos enrutados, pero no todos los eventos enrutados se propagan.
Most of the bubbling events are paired with a tunneling event. For example, the PreviewKeyDown (tunneling) key event is paired with the KeyDown event (bubbling).
For example, the following is a snapshot of the events defined in the UIElement class from MSDN:

Como puede observar, para el evento KeyDown, hay un evento de vista previa correspondiente: PreviewKeyDown, que es un evento de tunelización. Este es un ejemplo de un par de eventos de un evento de propagación y tunelización.
Como puede ver en la página de MSDN para este evento, hay una tabla que explica los detalles de este evento, que también indica si el evento es de propagación o de tunelización.
Manejo del evento
Cuando se encuentra un evento enrutado, es importante notificar al evento que se está controlando y que no es necesario pasarlo más. Cada tipo de controlador de eventos pasa un objeto de tipo RoutedEventArgs, dentro del cual hay una propiedad denominada Handled.
Debe establecer esta propiedad Handled en true. Una vez hecho esto, cualquier otro controlador de eventos presente en el árbol visual no controlará ese evento.
Los eventos de tunelización pueden ser útiles para controlar eventos en elementos que no ha creado usted mismo y, por lo tanto, no tiene una manera fácil de agregar un controlador de eventos. La tunelización tiene sentido si desea que el elemento de destino real sea el último que reciba el evento.
Tenga en cuenta que en la interfaz de usuario tiene un control de cuadro de lista con uno de sus elementos que contiene un cuadro de texto. Al hacer clic en el cuadro de texto, se terminará consumiendo el clic, sin embargo, el cuadro de lista no se seleccionará en absoluto.
En este caso, si define el evento de clic del mouse tunelizado o de vista previa, puede seleccionar primero el cuadro de lista, dejándolo sin controlar y, a continuación, se controla el clic en el cuadro de texto. De esta manera, se asegura de que el cuadro de lista esté seleccionado y, al mismo tiempo, tenga el clic en el cuadro de texto controlado en el controlador de eventos.