Eventos de vista previa

Los eventos de vista previa, también conocidos como eventos de tunelización, son eventos enrutados donde la dirección de la ruta viaja desde la raíz de la aplicación hacia el elemento que generó el evento y se notifica como el origen en los datos del evento. No todos los escenarios de eventos admiten o requieren eventos de vista previa; En este tema se describen las situaciones en las que existen eventos de vista previa, cómo deben controlarse las aplicaciones o componentes, y los casos en los que la creación de eventos de vista previa en componentes o clases personalizados podría ser adecuado.

Eventos y entradas de vista previa

Cuando controle eventos de vista previa en general, tenga cuidado con la marca de los eventos controlados en los datos del evento. Controlar un evento de vista previa en cualquier elemento que no sea el elemento que lo generó (el elemento que se notifica como origen en los datos del evento) tiene el efecto de no proporcionar a un elemento la oportunidad de controlar el evento que originó. A veces, este es el resultado deseado, especialmente si los elementos en cuestión existen en relaciones dentro de la composición de un control.

En el caso de los eventos de entrada específicamente, los eventos de vista previa también comparten instancias de datos de eventos con el evento de propagación equivalente. Si usa un controlador de clase de eventos de vista previa para marcar el evento de entrada controlado, no se invocará el controlador de clase de eventos de entrada de propagación. O bien, si usa un controlador de instancia de evento de vista previa para marcar el evento controlado, los controladores para el evento de propagación no se invocarán como de normal. Los controladores de clase o los controladores de instancia se pueden registrar o adjuntar con una opción que se va a invocar incluso si el evento está marcado como controlado, pero esa técnica no se usa normalmente.

Para obtener más información sobre el control de clases y cómo se relaciona con los eventos de vista previa, consulte Marcado de eventos enrutados como controlados y control de clases.

Solución de la supresión de eventos mediante controles

Un escenario en el que los eventos de vista previa se usan normalmente es para el control compuesto de los eventos de entrada. A veces, el autor del control suprime un determinado evento que se origina en su control, quizás para sustituir un evento definido por componentes que contenga más información o implique un comportamiento más específico. Por ejemplo, un Button de Windows Presentation Foundation (WPF) suprime los eventos de propagación MouseLeftButtonDown y MouseRightButtonDown iniciados por el Button o sus elementos compuestos en favor de capturar mouse e iniciar un evento Click que siempre se inicia por el propio Button. El evento y sus datos continúan a lo largo de la ruta, pero como el Button marca los datos del evento como Handled, solo se invocan los controladores del evento que indicaron específicamente que debían actuar en el caso handledEventsToo. Si otros elementos hacia la raíz de su aplicación todavía querían una oportunidad para controlar un evento de control suprimido, una alternativa es adjuntar controladores en el código con handledEventsToo especificado como true. Pero a menudo una técnica más sencilla es cambiar la dirección de enrutamiento que controla para que sea el equivalente de versión preliminar de un evento de entrada. Por ejemplo, si un control suprime MouseLeftButtonDown, intente adjuntar un controlador para PreviewMouseLeftButtonDown en su lugar. Esta técnica solo funciona para eventos de entrada de elementos base, como MouseLeftButtonDown. Estos eventos de entrada usan pares de túnel/burbuja, generan ambos eventos y comparten los datos del evento.

Cada una de estas técnicas tiene efectos secundarios o limitaciones. El efecto secundario de controlar el evento de vista previa es que controlar el evento en ese momento podría deshabilitar los controladores que esperan controlar el evento de propagación y, por lo tanto, la limitación es que normalmente no es una buena idea marcar el evento controlado mientras sigue en la parte de vista previa de la ruta. La limitación de la técnica handledEventsToo es que no se puede especificar un controlador handledEventsToo en XAML como un atributo, se debe registrar el controlador de eventos en código después de obtener una referencia de objeto al elemento donde se va a adjuntar el controlador.

Vea también