Visual Basic 和 WPF 事件处理

如果要在 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 页时,具有Namex:Name参数的每个 XAML 元素都被声明为Friend WithEvents。 因此,可以将任何 XAML 元素与 Handles 一起使用。

小窍门

Visual Studio IntelliSense 显示可以使用 Handles 的对象。

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

注释

不要同时使用 XAML 属性并将 Handles 相同的事件处理程序附加到同一事件,否则每个事件的事件处理程序将调用两次。

局限性

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

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

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

另请参阅