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 Handles
an 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 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
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 Handles
hinzugefü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 Me
verwenden. Das folgende Beispiel zeigt, wie Sie einen Ereignishandler mithilfe von Handles
an 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 WithEvents
deklariert. Daher können Sie ein beliebiges XAML-Element mit Handles
verwenden.
Trinkgeld
Visual Studio IntelliSense zeigt die Objekte, die mit Handles
verwendet 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 beispielsweiseHandles
verwenden, um einen Click Ereignishandler an eine Schaltfläche anzufügen, deren Basisklasse ButtonBase dasClick
Routingereignis auslöst. Eines der Features von Routingereignissen besteht jedoch darin, dass sie die Elementstruktur durchlaufen, wodurch einClick
-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ürHandled
Ereignisse zu ermöglichen, fügen Sie den Ereignishandler mithilfe der AddHandler(RoutedEvent, Delegate, Boolean)-Methode an, und legen Sie denhandledEventsToo
Parameter auftrue
fest.
Siehe auch
.NET Desktop feedback