2011-02-05 16 views
8

Estoy tratando de entender algunas cosas específicas de WPF, y todavía tengo que encontrar la relación concreta entre el método UIElement.AddHandler y el método EventManager.RegisterClassHandler.¿Cuál es la diferencia entre un listener de clase y un listner de instancia en WPF?

He buscado en Google un poco y encontré este interesante artículo de MSDN:

http://msdn.microsoft.com/en-us/library/ms747183.aspx

Aquí se afirma:

"eventos enrutados consideran dos tipos diferentes de oyentes al evento: los oyentes de clase e instancia Los oyentes de clase existen porque los tipos han llamado a una API particular de EventManager, RegisterClassHandler, en su constructor estático, o han anulado un método virtual de manejador de clase de una clase base de elementos. Los oyentes de instancia son instancias/elementos de clase particulares donde uno o más manejadores se han adjuntado para ese evento enrutado mediante una llamada a AddHandler ".

Bien, entonces sé la diferencia entre una clase y su instancia, pero de alguna manera no puedo entender esta parte específica del documento.

¿Alguien puede aclarar eso para mí?

Respuesta

11

No sé, qué es exactamente lo que quiere saber. Las cosas son bastante simples: puede registrar el controlador a nivel de instancia (objeto) o a nivel de clase. La diferencia es que cuando se registra evento a nivel de clase, primero se llama antes de que cualquier controlador de nivel de instancia (por supuesto túnel o burbujeo todavía tenga lugar antes, si la clase de manejo es inferior/superior en árbol lógico). Para que pueda manejar este evento en el nivel de clase y filtrar si este evento debe ser manejado por instancia o no (estableciendo e.Handled = true se detendrá el evento para pasar por otros controladores). Puede ser útil en algunos casos, pero por ahora no tengo ningún ejemplo en mi mente para compartir.

Esta muestra se registrará controlador de eventos que se llamará solamente cuando el evento fue levantado por ejemplo específico del elemento:

DockPanel panel = new DockPanel(); 
panel.AddHandler(Button.ClickEvent, new RoutedEventHandler(Button_Click)); 

Y esto creará controlador de eventos, que se llamará cada vez que cualquier DockPanel recibirá Botón .click caso, antes de instancia manejador de esta DockPanel se llamará:

EventManager.RegisterClassHandler(typeof(DockPanel), 
    Button.ClickEvent, new RoutedEventHandler(ButtonClass_Click)); 

Si los métodos fueron:

private void ButtonClass_Click(object sender, RoutedEventArgs e) 
{ 
    Debug.Write("Class level handler"); 
} 

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    Debug.Write("Instance level handler"); 
} 

Esta salida crearía:

nivel de clase de controlador
Instancia controlador de nivel

Pero si en el controlador de nivel de clase se debe establecer evento args a handeled (e.Handled = true;), se filtraría este evento, por ejemplo, controlador de nivel (y burbujeo en el árbol lógico).

+0

Eso era exactamente lo que quería saber y la frase "Y esto creará el controlador de eventos, que se llamará cada vez que DockPanel obtenga Button.Click event ...." dejó en claro dónde se produjo el error en mi pensamiento fue :) – UrbanEsc

+0

Siempre estoy feliz de ayudar :) – Pako

Cuestiones relacionadas