Eventos de vista previa

Los eventos de vista previa, también denominados eventos de túnel, son eventos enrutados cuya dirección de ruta se desplaza desde la raíz de la aplicación hacia el elemento que ha provocado el evento y se comunica como el origen en los datos de evento. No todos los escenarios de eventos admiten o requieren los eventos de vista previa; en este tema se describen las situaciones en que existe este tipo de eventos, cómo deben controlarlos las aplicaciones o los componentes, y los casos en que puede ser conveniente crearlos en componentes o clases personalizados.

Eventos de vista previa y entrada

Al administrar eventos de vista previa en general, extreme las precauciones en relación con marcarlos como controlados en los datos de evento. Controlar un evento de vista previa para cualquier elemento que no sea el que lo provocó (aquél que se comunica como origen en los datos de evento) hace que no se proporcione a este último la oportunidad de controlar el evento que ha provocado. A veces, éste es el resultado deseado, en particular si los elementos en cuestión existan en relaciones contenidas en una composición de controles de un control.

En concreto para los eventos de entrada, los eventos de vista previa también comparten instancias de datos de evento con el evento de propagación equivalente. Si utiliza un controlador de clase de evento de vista previa para marcar como controlado el evento de entrada, no se invocará el controlador de clase de evento de entrada de propagación. Por otra parte, si utiliza un controlador de instancia de evento de vista previa para marcar el evento como controlado, normalmente no se invocarán los controladores correspondientes al evento de propagación. Los controladores de clase o de instancia se pueden registrar o asociar con la opción de invocarlos aunque el evento esté marcado como controlado, pero se trata de una técnica de uso poco frecuente.

Para obtener más información sobre el control de clases y su relación con los eventos de vista previa, vea Marcar eventos enrutados como controlados y control de clases.

Evitar la supresión de eventos por parte de los controles

Un escenario donde se suelen utilizar eventos de vista previa es el control de eventos de entrada en controles compuestos. A veces, el autor del control impide que se provoque determinado evento desde su control, quizás para sustituir un evento definido por el componente que lleva más información o implica un comportamiento más concreto. Por ejemplo, un Button de Windows Presentation Foundation (WPF) suprime los eventos de propagación MouseLeftButtonDown y MouseLeftButtonDown generados por el objeto Button o sus elementos compuestos a favor de capturar el mouse y generar un evento Click que siempre lo genera el propio objeto Button. El evento y sus datos siguen su curso a lo largo de la ruta, pero puesto que Button marca los datos de evento como Handled, únicamente se invoca a los controladores del evento cuya actuación se indica específicamente en el caso handledEventsToo. Si otros elementos situados más cerca de la raíz de la aplicación tuvieran que tener la oportunidad de controlar un evento suprimido por un control, una alternativa consiste en adjuntar controladores en código especificando handledEventsToo en true. Sin embargo, es más sencilla la técnica de cambiar la dirección de enrutamiento que se administra de modo que sea el equivalente de vista previa de un evento de entrada. Por ejemplo, si un control suprime MouseLeftButtonDown, intente adjuntar en su lugar un controlador para PreviewMouseLeftButtonDown. Esta técnica sólo funciona para los eventos de entrada del elemento base, como MouseLeftButtonDown. Estos eventos de entrada utilizan pares de túnel/propagación, provocan ambos eventos y comparten los datos de evento.

Cada una de estas técnicas tiene efectos secundarios o limitaciones. El efecto secundario de controlar el evento de vista previa reside en que controlarlo en ese punto podría deshabilitar los controladores que esperan controlar el evento de propagación, y por consiguiente la limitación consiste en que no suele ser conveniente marcar el evento como controlado mientras se encuentre en la parte de la ruta correspondiente a la vista previa. La limitación de la técnica de handledEventsToo es que no se puede especificar un controlador de handledEventsToo en XAML como un atributo, hay que registrar el controlador de eventos en código después de obtener una referencia de objeto al elemento al que se asociará el controlador.

Vea también

Conceptos

Marcar eventos enrutados como controlados y control de clases

Información general sobre eventos enrutados