如果您在 Visual Basic .NET 中撰寫程式碼,可以使用該語言的 Handles 關鍵字將事件處理常式附加至物件。 物件可以是程式碼後置中的執行個體,或是 Extensible Application Markup Language (XAML) 中的元素。
Handles 可用於為通用語言執行平台 (CLR) 事件或 Windows Presentation Foundation (WPF) 路由事件 指派事件處理器。 不過,在為路由事件附加事件處理常式時,Handles 存在一些使用上的 限制。
先決條件
本文假設您具備基本的路由事件知識,而且您已經閱讀過路由事件概觀。 若要遵循本文中的範例,建議您先熟悉 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
若要對多個事件使用相同的處理常式,請以逗號分隔這些事件,例如 <事件1>, <事件2>, <事件3>。 例如: 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 元素具有 Name 或 x: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。 因此,您可以使用任何帶有 Handles 的 XAML 元素。
小提示
Visual Studio IntelliSense 會顯示可與 Handles 搭配使用的物件。
無論您使用 Handles、XAML 屬性語法、AddHandler 陳述式,或 AddHandler 方法附加事件處理常式,事件系統的行為都是相同的。
備註
請勿同時使用 XAML 屬性和 Handles 將相同的事件處理常式附加至相同事件,否則事件處理常式會針對每個事件被呼叫兩次。
局限性
Handles 關鍵字具有下列使用限制:
如果事件是物件的類別或基底類別的成員,您只能使用
Handles將事件處理常式附加至物件。 例如,您可以使用Handles將 Click 事件處理常式附加至 base class ButtonBase 引發Click路由事件的按鈕。 不過,路由事件的其中一個特點是它們會在元素樹中進行遍歷,這使得可以在比引發該事件的元素更高的層級處接收和處理事件。 父元素接聽和處理的路由事件稱為附加的事件。Handles無法用於附加事件,因為它的語法不支援在 XAML 元素樹中指定一個不同於引發事件的元素的接聽程式。 若要指派附加事件的事件處理常式,您必須使用 XAML 屬性語法或 AddHandler 方法。 如需附加事件的詳細資訊,請參閱附加事件概觀和WPF 中的附加事件。Handles語法不支援 Handled 事件的事件處理常式叫用。 若要讓您的事件處理常式能夠針對Handled事件被叫用,請使用 AddHandler(RoutedEvent, Delegate, Boolean) 方法附加事件處理常式,並將其handledEventsToo參數設定為true。