Visual Basic 和 WPF 事件处理 (WPF .NET)

如果使用 Visual Basic .NET 进行编码,则可以使用特定于语言的 Handles 关键字将事件处理程序附加到对象。 该对象可以是代码隐藏中的实例,也可以是 Extensible Application Markup Language (XAML) 中的元素。 Handles 可用于为公共语言运行时 (CLR) 事件或 Windows Presentation Foundation (WPF) 路由事件分配事件处理程序。 但是,当用于为路由事件附加事件处理程序时,Handles 存在一些使用限制

重要

面向 .NET 7 和 .NET 6 的桌面指南文档正在撰写中。

先决条件

本文假定你对路由事件有基本的了解,并且已阅读路由事件概述。 若要遵循本文中的示例,如果熟悉 Extensible Application Markup Language (XAML) 并知道如何编写 Windows Presentation Foundation (WPF) 应用程序,将会很有帮助。

语法

使用 Handles 关键字的 Sub 声明的语法为:Sub <procedure name> Handles <object name>.<event name>。 该语法将一个过程指定为事件处理程序,当 <event name> 指定的事件在 <object name> 指定的对象上引发时,该过程将运行。 该事件必须是对象类或基类的成员。 以下示例演示如何使用 Handles 将事件处理程序附加到 XAML 元素。

' 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 与在代码隐藏中定义的对象一起使用,通常使用 WithEvents 关键字声明该对象。 有关 WithEvents 用法的详细信息,请参阅这些示例。 WPF 使用 Friend WithEvents 自动声明所有 XAML 元素。 以下示例演示如何使用 WithEvents 声明在代码隐藏中定义的对象。

' 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

若要对多个事件使用相同的处理程序,请用逗号分隔 <object name>.<event name> 事件。 例如 Sub Button_Click(sender As Object, e As RoutedEventArgs) Handles Button1.Click, Button2.Click。 逗号分隔事件的顺序不重要。

可以使用多个 Handles 语句为同一事件分配不同的处理程序。 Handles 语句的顺序不会决定事件发生时调用处理程序的顺序。

提示

若要删除使用 Handles 添加的处理程序,请调用 RemoveHandler。 例如 RemoveHandler Button1.Click, AddressOf Button1_Click

在 WPF 应用程序中使用“Handles”

对于在 XAML 中定义的对象,Handles 事件语法 <object name>.<event name> 要求表示该对象的 XAML 元素具有 Namex:Name 属性。 但是,XAML 页面根元素不需要名称属性,因此可以使用名称 Me。 以下示例演示如何使用 Handles 将事件处理程序附加到 XAML 页面根元素。

' 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

编译 XAML 页面时,每个带有 Namex:Name 参数的 XAML 元素都将声明为 Friend WithEvents。 因此,可以将任何 XAML 元素与 Handles 一起使用。

提示

Visual Studio IntelliSense 显示可与 Handles 一起使用的对象。

无论是使用 Handles、XAML 特性语法、AddHandler 语句还是 AddHandler 方法附加事件处理程序,事件系统行为都是相同的。

注意

请勿同时使用 XAML 特性和 Handles 将同一事件处理程序附加到同一事件,否则每个事件都会调用该事件处理程序两次。

限制

Handles 关键字具有以下使用限制:

  • 如果事件是对象的类或基类的成员,则只能使用 Handles 将事件处理程序附加到对象。 例如,可以使用 HandlesClick 事件处理程序附加到基类 ButtonBase 引发 Click 路由事件的按钮。 但是,路由事件的功能之一是遍历元素树,这使得它可以在比引发它的元素更高的级别上侦听和处理 Click 事件。 父元素侦听和处理的路由事件称为“附加事件”Handles 不能用于附加事件,因为其语法不支持在 XAML 元素树中指定不同于引发事件的元素的侦听器。 若要为附加事件分配事件处理程序,需要使用 XAML 特性语法或 AddHandler 方法。 有关附加事件的详细信息,请参阅附加事件概述WPF 中的附加事件

  • Handles 语法不支持为 Handled 事件调用事件处理程序。 若要为 Handled 事件调用事件处理程序,请使用 AddHandler(RoutedEvent, Delegate, Boolean) 方法附加事件处理程序并将其 handledEventsToo 参数设置为 true

另请参阅