2009-09-22 11 views
62

He estado buscando descripciones de eventos "Vista previa ******" como cada elemento tiene eventos KeyDown y PreviewKeyDown. ¿Cuál es la diferencia (no es un evento adjunto y no lo es, la diferencia real convencional y la diferencia de modo de programación)¿Qué son los eventos de vista previa de WPF?

En cualquier clase derivada de Control, puede anular ambos métodos ... OnKeyDown y OnPreviewKeyDown, ahora estoy escribiendo mi control personalizado, ¿qué método debo usar? Y cuál es la diferencia entre los dos.

Respuesta

105

De Programación de WPF - Chris Sells e Ian Griffith

Con la excepción de eventos directos, WPF define eventos más enrutados en pares - un túnel y la otra burbujeo. El nombre del evento de tunelización siempre comienza con 'Vista previa' y es el primero en aparecer. Esto les brinda a los padres la oportunidad de ver el evento antes de que alcance al niño. Esto es seguido por la contraparte burbujeante. En la mayoría de los casos , manejará solo el burbujeo . La vista previa sería generalmente se usa para

  • bloque del evento (e.Handled = true)
  • causa de los padres para hacer algo con antelación para evento normal de su uso.

e.g. si UI Árbol = Botón contiene Cuadrícula contiene Lienzo contiene Elipse
Al hacer clic en la elipse se daría como resultado (MouseDownButton es devorado por Button y Click se levanta en su lugar.)

PreviewMouseDownButton 
PreviewMouseDownGrid 
PreviewMouseDownCanvas 
PreviewMouseDownEllipse 
MouseDownEllipse 
MouseDownCanvas 
MouseDownGrid 
+0

Gracias, he estado buscando en MSDN pero no lo encontré, leí a todos hablando de borboteo y tunelización, pero esta pieza de texto faltaba en todas partes. –

3

Básicamente, es el mismo evento pero ocurre justo antes del evento principal. Existen para que pueda escuchar esos tipos de eventos sin interferir con el comportamiento normal del control cuando ocurren esos eventos.

Por ejemplo, los botones hacen cosas cuando haces clic o MouseEnter, etc. Si manejas esos eventos tú mismo, debes asegurarte de hacer lo mismo o sino tu botón no actuará de la misma manera. Los eventos de vista previa le dan un evento en la misma línea de tiempo sin tener que preocuparse por jugar con la funcionalidad existente.

Esto es especialmente útil cuando se trata de estilos personalizados/disparadores/plantillas de control. Cuando comience a anular el aspecto/comportamiento del control.

Por lo tanto, en su Control, realice el trabajo principal que desea en el evento OnKeyDown y deje el evento de vista previa para que otra persona lo use, es así como trabajo con ellos.

7

me encontré con esta entrada del blog realmente útil para describir la diferencia:

http://joshsmithonwpf.wordpress.com/2007/06/22/overview-of-routed-events-in-wpf/

Usted tiene el árbol visual, cuando se produce un evento en un elemento en el árbol, en primer lugar un evento de presentación se desplazará desde el Rootear al elemento (tunelización): el evento PreviewKeyDown se levantará en todos estos elementos, y luego un evento "normal" viajará del elemento a la raíz (burbujeo).

3

Esta diferencia tiene que ver con eventos enrutados, que es cómo WPF implementa su estrategia de manejo de eventos. El nombre de evento estándar (es decir, KeyDown, etc.) implica una estrategia de enrutamiento de burbujeo. Los anteriores a "Vista previa" (es decir, PreviewKeyDown, etc.) implican una estrategia de enrutamiento de túneles. Puede leer sobre estas estrategias en más detalle here. Básicamente, cuando se invoca un evento en WPF, primero se desplaza desde el elemento superior al árbol visual hasta el elemento que invoca el evento y finalmente regresa hacia arriba. En el camino hacia abajo, encontrará el evento PreviewKeyDown, y en el viaje de regreso se encontrará con el evento KeyDown, en ese orden.

Cuestiones relacionadas