Freigeben über


Visual Basic- und WPF-Ereignisbehandlung (WPF .NET)

Wenn Sie in Visual Basic .NET codieren, können Sie das sprachspezifische Schlüsselwort Handles 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 Windows Presentation Foundation (WPF) geroutete Ereignissezuzuweisen. Handles weist jedoch einige Verwendungsbeschränkungen einschränkungen auf, die beim Anfügen von Ereignishandlern für Routingereignisse.

Voraussetzungen

In diesem Artikel wird ein grundlegendes Wissen über geroutete Ereignisse vorausgesetzt, und es wird davon ausgegangen, dass Sie die Übersicht über geroutete Ereignissegelesen 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 durch <event name> angegebenes Ereignis für ein durch <object name>angegebenes Objekt ausgelöst wird. Das Ereignis muss ein Mitglied der Klasse oder Basisklasse des Objekts sein. Das folgende Beispiel zeigt, wie Sie einen Ereignishandler mithilfe von Handlesan ein XAML-Element anfügen.

' 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

Wenn Sie Handles mit einem objekt verwenden möchten, das in CodeBehind definiert ist, deklarieren Sie das Objekt in der Regel mithilfe des Schlüsselworts WithEvents. Weitere Informationen zur WithEvents Nutzung finden Sie in diesen Beispielen. WPF deklariert automatisch alle XAML-Elemente mithilfe von Friend WithEvents. Das folgende Beispiel zeigt, wie sie ein objekt deklarieren, das in CodeBehind mithilfe von WithEventsdefiniert 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

Um denselben Handler für mehrere Ereignisse zu verwenden, trennen Sie die <object name>.<event name>-Ereignisse durch Kommas. 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 für dasselbe Ereignis unterschiedliche Handler durch mehrere Anweisungen Handles zuweisen. Die Reihenfolge der Handles-Anweisungen bestimmt nicht die Reihenfolge, in der Handler aufgerufen werden, wenn das Ereignis auftritt.

Tipp

Um einen Handler zu entfernen, der mit Handleshinzugefügt wurde, rufen Sie RemoveHandlerauf. 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>, dass das XAML-Element, das das Objekt darstellt, eine Name- oder x:Name-Eigenschaft aufweist. Für das XAML-Seitenstammelement ist jedoch keine Namenseigenschaft erforderlich; stattdessen können Sie den Namen Meverwenden. Das folgende Beispiel zeigt, wie Sie einen Ereignishandler mithilfe von Handlesan einen XAML-Seitenstamm 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 ein beliebiges XAML-Element mit Handlesverwenden.

Trinkgeld

Visual Studio IntelliSense zeigt die Objekte, die mit Handlesverwendet werden können.

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

Anmerkung

Verwenden Sie nicht sowohl XAML-Attribute als auch Handles, um denselben Ereignishandler an dasselbe Ereignis anzufügen, andernfalls wird der Ereignishandler zweimal für jedes Ereignis aufgerufen.

Begrenzungen

Die Handles Schlüsselwort hat die folgenden Verwendungseinschränkungen:

  • Sie können Handles nur verwenden, um einen Ereignishandler an ein Objekt anzufügen, wenn es sich bei dem Ereignis um ein Element der Klasse oder Basisklasse des Objekts handelt. Sie können beispielsweise Handles verwenden, um einen Click Ereignishandler an eine Schaltfläche anzufügen, deren Basisklasse ButtonBase das Click Routingereignis auslöst. Eines der Features von Routingereignissen besteht jedoch darin, dass sie die Elementstruktur durchlaufen, wodurch ein Click-Ereignis auf einer höheren Ebene als das ausgelöste Element überwacht und behandelt werden kann. Ein Routingereignis, auf das ein übergeordnetes Element lauscht und das es behandelt, wird als angefügtes Ereignisbezeichnet. Handles kann nicht für angefügte Ereignisse verwendet werden, da seine 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 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 den handledEventsToo Parameter auf truefest.

Siehe auch