Visual Basic- und WPF-Ereignisbehandlung (WPF .NET)
Wenn Sie in Visual Basic .NET programmieren, können Sie das sprachspezifische Schlüsselwort Ziehpunkte verwenden, um einen Ereignishandler an ein Objekt anzuhängen. Das Objekt kann eine Instanz in 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)-Routingereignisse zuzuweisen. Handles
hat jedoch einige Einschränkungen bei der Verwendung, wenn Sie Ereignishandler für weitergeleitete Ereignisse anhängen.
Voraussetzungen
Im Artikel wird davon ausgegangen, dass Sie grundlegende Kenntnisse über Routingereignisse besitzen und die Übersicht über Routingereignisse gelesen haben. Um den Beispielen in diesem Artikel zu folgen, ist es hilfreich, wenn Sie mit Extensible Application Markup Language (XAML) vertraut sind und wissen, wie Windows Presentation Foundation-Anwendungen (WPF-Anwendungen) geschrieben werden.
Syntax
Die Syntax für eine Sub
-Deklaration, die das Schlüsselwort Ziehpunkte verwendet, lautet: Sub <procedure name> Handles <object name>.<event name>
. Diese Syntax bestimmt eine Prozedur als Ereignisbehandlungsroutine, die ausgeführt wird, wenn ein von <event name>
angegebenes Ereignis auf einem von <object name>
angegebenen Objekt ausgelöst wird. Das Ereignis muss ein Element der Klasse oder Basisklasse des Objekts sein. Das folgende Beispiel zeigt, wie Sie einen Ereignishandler mit Handles
einem 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
Zur Verwendung von Handles
mit einem in Code-Behind definierten Objekt deklarieren Sie das Objekt normalerweise mit dem Schlüsselwort WithEvents. Weitere Informationen zur WithEvents
-Verwendung finden Sie in diesen Beispielen. WPF deklariert automatisch alle XAML-Elemente mit Friend WithEvents
. Das folgende Beispiel zeigt, wie Sie ein in Codebehind definiertes Objekt mit WithEvents
nutzen.
' 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 Komma. Beispielsweise Sub Button_Click(sender As Object, e As RoutedEventArgs) Handles Button1.Click, Button2.Click
. Die Reihenfolge der durch Komma getrennten Ereignisse ist unerheblich.
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
Um einen Handler zu entfernen, der mit Handles
hinzugefügt wurde, rufen Sie RemoveHandler auf. Beispielsweise RemoveHandler Button1.Click, AddressOf Button1_Click
.
Verwenden von „Handles“ in einer WPF-Anwendung
Für ein in XAML definiertes Objekt verlangt <object name>.<event name>
der Ziehpunkte-Ereignissyntax, dass das XAML-Element, das das Objekt darstellt, eine Name- oder x:Name-Eigenschaft hat. Für das XAML-Seitenstammelement ist jedoch keine Namenseigenschaft erforderlich, für die Sie den Namen Me
verwenden können. Das folgende Beispiel zeigt, wie Sie einen Ereignishandler mit Handles
einem XAML-Seitenstamms 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
nutzen.
Tipp
Visual Studio IntelliSense zeigt die Objekte an, die mit Handles
verwendet werden können.
Unabhängig davon, ob Sie einen Ereignishandler mithilfe von Handles
XAML-Attributsyntax, der AddHandler-Anweisung oder der AddHandler-Methode anfügen, ist das Ereignissystemverhalten identisch.
Hinweis
Verwenden Sie nicht beide XAML-Attribute und Handles
, um denselben Ereignishandler an dasselbe Ereignis anzuhängen, da der Ereignishandler sonst für jedes Ereignis zweimal aufgerufen wird.
Einschränkungen
Das Schlüsselwort Ziehpunkte weist folgende Nutzungseinschränkungen auf:
Sie können mit
Handles
einen Ereignishandler nur dann an ein Objekt anhängen, wenn das Ereignis ein Mitglied der Klasse oder Basisklasse des Objekts ist. Sie können zum Beispiel mitHandles
einen Click-Ereignishandler an eine Schaltfläche anhängen, deren Basisklasse ButtonBase das RoutingereignisClick
auslöst. Eines der Features von Routingereignissen besteht jedoch darin, dass sie die Elementstruktur durchlaufen, wodurch es möglich ist, einClick
-Ereignis auf einer höheren Ebene als das Element zu behandeln, das es ausgelöst hat. Ein routingfähiges Ereignis, das ein übergeordnetes Element überwacht und behandelt wird, wird als angefügtes Ereignis bezeichnet.Handles
kann nicht für angefügte Ereignisse verwendet werden, da seine Syntax das Angeben eines anderen Listeners in der XAML-Elementstruktur nicht unterstützt als das Element, das das Ereignis ausgelöst hat. Zum Zuweisen von Ereignishandlern für angefügte Ereignisse müssen Sie entweder 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 aktivieren, 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