Gewusst wie: Hinzufügen einer Klassenbehandlung für ein Routingereignis
Aktualisiert: November 2007
Routingereignisse können entweder von Klassenhandlern oder Instanzhandlern verarbeitet werden, die sich auf beliebigen Knoten der Route befinden. Klassenhandler werden zuerst aufgerufen und können von Klassenimplementierungen verwendet werden, um Ereignisse der Instanzbehandlung zu unterdrücken oder um andere ereignisspezifische Verhalten für Ereignisse auszulösen, deren Besitzer Basisklassen sind. Dieses Beispiel zeigt zwei eng miteinander verwandte Verfahren zum Implementieren von Klassenhandlern.
Beispiel
In diesem Beispiel wird eine benutzerdefinierte Klasse basierend auf dem Canvas-Bereich verwendet. Die Grundvoraussetzung der Anwendung besteht darin, dass die benutzerdefinierte Klasse Verhalten für ihre untergeordneten Elemente einführt, zum Beispiel das Abfangen aller Klicks mit der linken Maustaste und das Markieren als behandelt, bevor die Klasse des untergeordneten Elements oder beliebige Instanzhandler aufgerufen werden.
Die UIElement-Klasse legt eine virtuelle Methode offen, die die Klassenbehandlung für das PreviewMouseLeftButtonDown-Ereignis ermöglicht, indem das Ereignis einfach überschrieben wird. Auf diese Weise können Sie die Klassenbehandlung am einfachsten implementieren, wenn eine virtuelle Methode dieser Art in der Klassenhierarchie verfügbar ist. Der folgende Code zeigt die OnPreviewMouseLeftButtonDown-Implementierung in "MyEditContainer", die von Canvas abgeleitet wird. Die Implementierung markiert das Ereignis in den Argumenten als behandelt und fügt dann Code hinzu, um das Quellelement mit einer grundlegenden sichtbaren Änderung zu versehen.
protected override void OnPreviewMouseRightButtonDown(System.Windows.Input.MouseButtonEventArgs e)
{
e.Handled = true; //suppress the click event and other leftmousebuttondown responders
MyEditContainer ec = (MyEditContainer)e.Source;
if (ec.EditState)
{ ec.EditState = false; }
else
{ ec.EditState = true; }
base.OnPreviewMouseRightButtonDown(e);
}
Wenn für die Basisklassen bzw. für die jeweilige Methode kein virtuelles Element verfügbar ist, können Sie die Klassenbehandlung direkt mithilfe einer Hilfsmethode der EventManager-Klasse hinzufügen, nämlich RegisterClassHandler. Sie sollten diese Methode nur innerhalb der statischen Initialisierung von Klassen aufrufen, die die Klassenbehandlung hinzufügen. In diesem Beispiel wird ein weiterer Handler für PreviewMouseLeftButtonDown hinzugefügt, und in diesem Fall handelt es sich bei der registrierten Klasse um eine benutzerdefinierte Klasse. Im Gegensatz dazu ist die registrierte Klasse bei Verwendung von virtuellen Elementen tatsächlich die UIElement-Basisklasse. Falls Basisklassen und Unterklasse jeweils die Klassenbehandlung registrieren, werden die Unterklassenhandler zuerst aufgerufen. In einer Anwendung wird dann ein Verhalten ausgeführt, bei dem dieser Handler zuerst ein Meldungsfeld anzeigt, bevor die visuelle Änderung im Handler der virtuellen Methode dargestellt wird.
static MyEditContainer()
{
EventManager.RegisterClassHandler(typeof(MyEditContainer), PreviewMouseRightButtonDownEvent, new RoutedEventHandler(LocalOnMouseRightButtonDown));
}
internal static void LocalOnMouseRightButtonDown(object sender, RoutedEventArgs e)
{
MessageBox.Show("this is invoked before the On* class handler on UIElement");
//e.Handled = true; //uncommenting this would cause ONLY the subclass' class handler to respond
}
Siehe auch
Aufgaben
Gewusst wie: Behandeln eines Routingereignisses
Konzepte
Markieren von Routingereignissen als behandelt und Klassenbehandlung
Übersicht über Routingereignisse