Freigeben über


Vorgehensweise: Hinzufügen der Klassenbehandlung für ein Routingereignis

Routingereignisse können entweder von Klassenhandlern oder Instanzhandlern auf einem beliebigen Knoten in der Route behandelt werden. Klassenhandler werden zuerst aufgerufen und können von Klassenimplementierungen verwendet werden, um Ereignisse aus der Instanzbehandlung zu unterdrücken oder andere ereignisspezifische Verhaltensweisen für Ereignisse einzuführen, die sich im Besitz von Basisklassen befinden. In diesem Beispiel werden zwei eng verwandte Techniken für die Implementierung von Klassenhandlern veranschaulicht.

Beispiel

In diesem Beispiel wird eine benutzerdefinierte Klasse basierend auf dem Canvas Panel verwendet. Die Grundannahme der Anwendung besteht darin, dass die benutzerdefinierte Klasse Verhaltensweisen für ihre untergeordneten Elemente einführt, einschließlich des Abfangens aller linken Maustastenklicks und diese als behandelt markiert, bevor die Klasse des untergeordneten Elements oder jegliche Instanzhandler darauf aufgerufen werden.

Die UIElement Klasse macht eine virtuelle Methode verfügbar, die die Klassenbehandlung für das PreviewMouseLeftButtonDown Ereignis ermöglicht, indem das Ereignis einfach überschrieben wird. Dies ist die einfachste Möglichkeit, die Klassenbehandlung zu implementieren, wenn eine solche virtuelle Methode irgendwo in der Klassenhierarchie verfügbar ist. Der folgende Code zeigt die Implementierung von OnPreviewMouseLeftButtonDown im "MyEditContainer", der von Canvas abgeleitet ist. Die Implementierung markiert das Ereignis in den Argumenten als bearbeitet und fügt dann Code hinzu, um dem Quellelement eine grundlegende sichtbare Änderung hinzuzufügen.

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);
}
Protected Overrides Sub OnPreviewMouseRightButtonDown(ByVal e As System.Windows.Input.MouseButtonEventArgs)
    e.Handled = True 'suppress the click event and other leftmousebuttondown responders
    Dim ec As MyEditContainer = CType(e.Source, MyEditContainer)
    If ec.EditState Then
        ec.EditState = False
    Else
        ec.EditState = True
    End If
    MyBase.OnPreviewMouseRightButtonDown(e)
End Sub

Wenn keine virtuelle Klasse für Basisklassen oder für diese bestimmte Methode verfügbar ist, kann die Klassenbehandlung direkt mithilfe einer Hilfsmethode der EventManager Klasse hinzugefügt werden. RegisterClassHandler Diese Methode sollte nur innerhalb der statischen Initialisierung von Klassen aufgerufen werden, die die Klassenbehandlung hinzufügen. In diesem Beispiel wird ein weiterer Handler für PreviewMouseLeftButtonDown hinzugefügt. In diesem Fall ist die registrierte Klasse die benutzerdefinierte Klasse. Im Gegensatz dazu ist die registrierte Klasse bei Verwendung der Virtuellen tatsächlich die UIElement Basisklasse. In Fällen, in denen Basisklassen und Unterklassen jeweils eine Klassenregistrierungsbehandlung registrieren, werden zuerst die Unterklassenverarbeiter aufgerufen. Das Verhalten in einer Anwendung wäre, dass zuerst dieser Handler sein Meldungsfeld anzeigt und dann die visuelle Änderung im Handler der virtuellen Methode angezeigt würde.

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
}
Shared Sub New()
    EventManager.RegisterClassHandler(GetType(MyEditContainer), PreviewMouseRightButtonDownEvent, New RoutedEventHandler(AddressOf LocalOnMouseRightButtonDown))
End Sub
Friend Shared Sub LocalOnMouseRightButtonDown(ByVal sender As Object, ByVal e As RoutedEventArgs)
    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
End Sub

Siehe auch