Was ist der Unterschied zwischen einem Klassenlistener und einem Instanzlistener in WPF?

8

Ich versuche, meinen Kopf um einige WPF-spezifische Sachen zu wickeln, und muss noch die konkrete Beziehung zwischen der UIElement.AddHandler-Methode und der EventManager.RegisterClassHandler-Methode finden.

Ich habe ein wenig gegoogelt und diesen interessanten MSDN-Artikel gefunden:

Ссылка

Hier steht:

"Geroutete Ereignisse berücksichtigen zwei verschiedene Listener-Typen für das Ereignis: Klassenlistener und Instanzlistener. Klassenlistener existieren, weil Typen in ihrem statischen Konstruktor eine bestimmte EventManager-API, RegisterClassHandler, aufgerufen haben oder eine virtuelle Klassenhandlermethode überschrieben haben Eine Element-Basisklasse. Instanz-Listener sind bestimmte Klasseninstanzen / Elemente, bei denen ein oder mehrere Handler für dieses Routingereignis durch einen Aufruf von AddHandler angefügt wurden. "

Okay, jetzt kenne ich den Unterschied zwischen einer Klasse und ihrer Instanz, aber irgendwie kann ich aus diesem speziellen Teil des Dokuments keinen Sinn machen.

Kann mir das jemand klar machen?

    
UrbanEsc 05.02.2011, 18:35
quelle

1 Antwort

11

Ich weiß nicht, was genau du wissen willst. Die Dinge sind ziemlich einfach: Sie können den Handler auf Instanzenebene (Objekt) oder auf Klassenebene registrieren.

Der Unterschied besteht darin, dass wenn Sie ein Ereignis auf Klassenebene registrieren, es zuerst aufgerufen wird, bevor irgendwelche Instanzenlevel-Handler aufgerufen werden (natürlich findet Tunnel- oder Sprudeln immer noch statt, wenn die Klasse in der logischen Struktur niedriger / höher ist). So können Sie dieses Ereignis auf Klassenebene behandeln und filtern, ob dieses Ereignis von der Instanz behandelt werden soll oder nicht (indem Sie e.Handled = true setzen, werden Sie das Ereignis anhalten, um andere Handler zu durchlaufen). Es kann in einigen Fällen nützlich sein, aber für jetzt habe ich kein Beispiel in meinen Gedanken zu teilen.

In diesem Beispiel wird der Ereignishandler registriert, der nur aufgerufen wird, wenn das Ereignis für eine bestimmte Instanz des Elements ausgelöst wurde:

%Vor%

Und dies wird einen Event-Handler erzeugen, der jedes Mal aufgerufen wird, wenn DockPanel das Button.Click-Ereignis erhält, bevor der Instanz-Handler dieses DockPanel aufgerufen wird:

%Vor%

Wenn Methoden waren:

%Vor%

Dies würde Ausgabe erzeugen:

  

Klassen-Level-Handler
  Instanzlevel-Handler

Wenn Sie jedoch im Klassen-Handler Ereignisargumente auf handled ( e.Handled = true; ) setzen würden, würde dieses Ereignis für den Instanz-Level-Handler herausgefiltert (und in der logischen Struktur aufblubbern).

    
Pako 05.02.2011, 18:45
quelle

Tags und Links