Freigeben über


Behandeln von Visual Basic- und WPF-Ereignissen

Wenn Sie in Visual Basic .NET codieren, können Sie das sprachspezifische Handles-Schlüsselwort verwenden, um einen Ereignishandler an ein Objekt anzufügen. Das Objekt kann eine Instanz im CodeBehind oder ein Element in Extensible Application Markup Language (XAML) sein. Handles kann verwendet werden, um Ereignishandler für CLR-Ereignisse (Common Language Runtime) oder Routingereignisse von Windows Presentation Foundation (WPF) zuzuweisen. Es gibt jedoch einige Handles, wenn es zum Anfügen von Ereignishandlern für geroutete Ereignisse verwendet wird.

Voraussetzungen

Im Artikel wird davon ausgegangen, dass Sie über grundlegende Kenntnisse im Zusammenhang mit Routingereignissen verfügen und die Übersicht über Routingereignisse gelesen haben. Um den Beispielen in diesem Artikel zu folgen, hilft es Ihnen, wenn Sie mit Extensible Application Markup Language (XAML) vertraut sind und wissen, wie Sie Windows Presentation Foundation (WPF)-Anwendungen schreiben.

Syntax

Die Syntax für eine Sub Deklaration, die das Handles-Schlüsselwort verwendet, lautet: Sub <procedure name> Handles <object name>.<event name>. Diese Syntax bezeichnet eine Prozedur als Ereignishandler, die ausgeführt wird, wenn ein Ereignis, das durch <event name> spezifiziert wird, bei einem vom <object name> angegebenen Objekt ausgelöst wird. Das Ereignis muss ein Mitglied der Klasse oder Basisklasse des Objekts sein. Das folgende Beispiel zeigt, wie Sie einen Ereignishandler an ein XAML-Element anhängen, Handles.

' Click event handler attached to XamlButton using Handles.
Private Sub XamlButton_Click(sender As Object, e As RoutedEventArgs) Handles XamlButton.Click

    ' Handler logic.
    Debug.WriteLine($"Click event handler attached to XamlButton using Handles.")

End Sub

Handles Wenn Sie ein objekt verwenden möchten, das in CodeBehind definiert ist, deklarieren Sie das Objekt in der Regel mithilfe des WithEvents-Schlüsselworts. Weitere Informationen zur WithEvents Verwendung finden Sie in diesen Beispielen. WPF deklariert automatisch alle XAML-Elemente mithilfe von Friend WithEvents. Das folgende Beispiel zeigt, wie ein Objekt deklariert wird, das im Code-Behind mithilfe von WithEvents definiert ist.

' Declare a new button using WithEvents.
Dim WithEvents CodeButton As New Button With {
    .Content = "New button",
    .Background = Brushes.Yellow
}

' Click event handler attached to CodeButton using Handles.
Private Sub CodeButton_Click(sender As Object, e As RoutedEventArgs) Handles CodeButton.Click

    ' Handler logic.
    Debug.WriteLine($"Click event handler attached to CodeButton using Handles.")

End Sub

Wenn Sie denselben Handler für mehrere Ereignisse verwenden möchten, trennen Sie die <object name>.<event name> Ereignisse durch Trennzeichen. Beispiel: Sub Button_Click(sender As Object, e As RoutedEventArgs) Handles Button1.Click, Button2.Click. Die Reihenfolge der kommagetrennten Ereignisse ist unwesentlich.

Sie können unterschiedliche Handler für dasselbe Ereignis mit mehreren Handles Anweisungen zuweisen. Die Reihenfolge der Handles Anweisungen bestimmt nicht die Reihenfolge, in der Handler aufgerufen werden, wenn das Ereignis auftritt.

Tipp

Rufen Sie remove a handler that was added with Handles, call RemoveHandler. Beispiel: RemoveHandler Button1.Click, AddressOf Button1_Click.

Verwenden von "Handles" in einer WPF-Anwendung

Für ein in XAML definiertes Objekt erfordert die Handles-Ereignissyntax <object name>.<event name> das XAML-Element, das das Objekt darstellt, um über eine Name oder x:Name-Eigenschaft zu verfügen. Für das XAML-Seitenstammelement ist jedoch keine Namenseigenschaft erforderlich, für die Sie den Namen Meverwenden können. Das folgende Beispiel zeigt, wie Sie mit Handles einen Ereignishandler am Stamm einer XAML-Seite anfügen.

' Loaded event handler attached to the XAML page root using Handles.
Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded

    ' Handler logic.
    Debug.WriteLine($"Loaded event handler attached to Window using Handles.")

End Sub

Wenn eine XAML-Seite kompiliert wird, wird jedes XAML-Element mit einem Name oder x:Name Parameter als Friend WithEventsdeklariert. Daher können Sie jedes XAML-Element mit Handles verwenden.

Tipp

Visual Studio IntelliSense zeigt die Objekte an, mit Handlesdenen sie verwendet werden können.

Unabhängig davon, ob Sie einen Ereignishandler mithilfe Handlesder XAML-Attributsyntax, der AddHandler-Anweisung oder der AddHandler Methode anfügen, ist das Ereignissystemverhalten identisch.

Hinweis

Verwenden Sie nicht sowohl XAML-Attribute als auch Handles, um denselben Ereignishandler an dasselbe Ereignis anzuhängen, ansonsten wird der Ereignishandler zweimal für jedes Ereignis aufgerufen.

Einschränkungen

Das Handles-Schlüsselwort weist die folgenden Verwendungseinschränkungen auf:

  • Sie können nur dann Handles einen Ereignishandler an ein Objekt anfügen, wenn es sich bei dem Ereignis um ein Element der Klasse oder Basisklasse des Objekts handelt. Sie können beispielsweise einen Ereignishandler mit Handles an eine Schaltfläche anfügen, deren Basisklasse Click das ButtonBase geroutete Ereignis auslöst. Eines der Features von Routingereignissen besteht jedoch darin, dass sie die Elementstruktur durchlaufen, wodurch es möglich ist, ein Click Ereignis auf einer höheren Ebene zu überwachen und zu behandeln als das Element, das es ausgelöst hat. Ein Routingereignis, auf das ein übergeordnetes Element lauscht und verarbeitet, wird als angefügtes Ereignis bezeichnet. Handles kann nicht für angefügte Ereignisse verwendet werden, da die Syntax die Angabe eines anderen Listeners in der XAML-Elementstruktur nicht unterstützt als das Element, das das Ereignis ausgelöst hat. Um Ereignishandler für angefügte Ereignisse zuzuweisen, müssen Sie entweder eine XAML-Attributsyntax oder die AddHandler Methode verwenden. Weitere Informationen zu angefügten Ereignissen finden Sie unter Übersicht über angefügte Ereignisse und angefügte Ereignisse in WPF.

  • Handles Die Syntax unterstützt keinen Ereignishandleraufruf für Handled Ereignisse. Um das Aufrufen des Ereignishandlers für Handled Ereignisse zu ermöglichen, fügen Sie den Ereignishandler mithilfe der AddHandler(RoutedEvent, Delegate, Boolean) Methode an, und legen Sie dessen handledEventsToo Parameter auf true.

Siehe auch