如果要在 Visual Basic .NET 中编写代码,则可以使用特定于语言的 Handles 关键字将事件处理程序附加到对象。 该对象可以是代码隐藏中的实例,也可以是可扩展应用程序标记语言(XAML)中的元素。
Handles
可用于为公共语言运行时 (CLR) 事件或 Windows Presentation Foundation (WPF) 路由事件分配事件处理程序。 但是,在用于附加路由事件的事件处理程序时, Handles
存在一些使用 限制 。
先决条件
本文假设您具有有关路由事件的基本知识,并且已经阅读了 路由事件概述。 若要遵循本文中的示例,如果你熟悉可扩展应用程序标记语言(XAML),并且知道如何编写 Windows Presentation Foundation (WPF) 应用程序,则它很有帮助。
语法
使用Sub
关键字Handles的声明的语法是:Sub <procedure name> Handles <object name>.<event name>
。 该语法将一个过程指定为事件处理程序,当<object name>
对象上指定的事件<event 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 会自动声明所有的 XAML 元素,使用Friend WithEvents
。 下面的示例演示如何声明使用 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 应用程序中使用‘句柄’
对于在 XAML 中定义的对象, Handles 事件语法 <object name>.<event name>
要求表示对象的 XAML 元素具有 Namex:Name 属性。 但是,XAML 页面根元素不需要 name 属性,可以使用该元素的名称 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 页时,具有Name
或x:Name
参数的每个 XAML 元素都被声明为Friend WithEvents
。 因此,可以将任何 XAML 元素与 Handles
一起使用。
小窍门
Visual Studio IntelliSense 显示可以使用 Handles
的对象。
无论使用 XAML 属性语法、AddHandler 语句还是AddHandler方法附加事件处理程序Handles
,事件系统行为都是相同的。
注释
不要同时使用 XAML 属性并将 Handles
相同的事件处理程序附加到同一事件,否则每个事件的事件处理程序将调用两次。
局限性
Handles 关键字具有以下使用限制:
只有当事件是对象类或基类的成员时,才能使用
Handles
将事件处理程序附加到对象。 例如,您可以使用Handles
将 Click 事件处理程序附加到一个按钮,该按钮的基类 ButtonBase 会引发Click
路由事件。 但是, 路由事件 的功能之一是遍历元素树,这使得它可以侦听和处理Click
比引发它的元素更高的级别的事件。 父元素监听并处理的路由事件称为附加事件。Handles
不能用于附加事件,因为它的语法不支持在 XAML 元素树中指定不同于引发事件的元素的侦听器。 若要为附加事件分配事件处理程序,需要使用 XAML 属性语法或 AddHandler 方法。 有关附加事件的详细信息,请参阅 WPF 中的 附加事件概述 和 附加事件。Handles
语法不支持为Handled事件调用事件处理程序。 若要为事件调用Handled
事件处理程序,请使用 AddHandler(RoutedEvent, Delegate, Boolean) 该方法附加事件处理程序并将其handledEventsToo
参数设置为true
。