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.

Wichtig

Der Desktopleitfaden zu .NET 7 und .NET 6 ist in Bearbeitung.

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 Handleseinem 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 Meverwenden 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 HandlesXAML-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 mit Handles einen Click-Ereignishandler an eine Schaltfläche anhängen, deren Basisklasse ButtonBase das Routingereignis Click 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 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ür Handled-Ereignisse zu aktivieren, fügen Sie den Ereignishandler mithilfe der AddHandler(RoutedEvent, Delegate, Boolean)-Methode an, und legen Sie den handledEventsToo-Parameter auf true fest.

Siehe auch