Visual Basic 和 WPF 事件處理 (WPF .NET)
如果您要在 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
若要對多個事件使用相同的處理常式,請以逗號分隔 <object name>.<event name>
事件。 例如: Sub Button_Click(sender As Object, e As RoutedEventArgs) Handles Button1.Click, Button2.Click
。 逗號分隔事件的順序不重要。
您可以使用多個 Handles
陳述式,為相同事件指派不同的處理常式。 Handles
陳述式的順序不會決定事件發生時叫用處理常式的順序。
提示
若要移除使用 Handles
新增的處理常式,請呼叫 RemoveHandler。 例如: Sub Button_Click(sender As Object, e As RoutedEventArgs) Handles Button1.Click, Button2.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 事件處理常式附加至其基底類別 ButtonBase 引發Click
路由事件的按鈕。 不過,路由事件的其中一個功能是它們會周遊元素樹狀結構,以便能夠在比引發事件之元素的更高層級接聽並處理Click
事件。 父元素接聽和處理的路由事件稱為附加事件。Handles
無法用於附加事件,因為其語法不支援在 XAML 元素樹狀結構中指定與引發事件的元素不同的接聽程式。 若要指派附加事件的事件處理常式,您必須使用 XAML 屬性語法或 AddHandler 方法。 如需附加事件的詳細資訊,請參閱附加事件概觀和 WPF 中的附加事件。Handles
語法不支援 Handled 事件的事件處理常式叫用。 若要讓您的事件處理常式能夠針對Handled
事件叫用,請使用 AddHandler(RoutedEvent, Delegate, Boolean) 方法附加事件處理常式,並將其handledEventsToo
參數設定為true
。