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

如果您要在 Visual Basic .NET 中撰寫程式碼,您可以使用語言特定的 Handles 關鍵字,將事件處理常式附加至 物件。 物件可以是程式碼後置中的實例,或是 Extensible Application Markup Language (XAML) 中的專案。 Handles 可用來指派 Common Language Runtime (CLR) 事件或 Windows Presentation Foundation (WPF) 路由事件的 事件處理常式。 不過,當用來附加路由事件的事件處理常式時, Handles 會有一些使用 限制

重要

.NET 7 和 .NET 6 的桌面指南檔正在建置中。

必要條件

本文假設您已瞭解路由事件,而且您已閱讀 路由事件概觀 。 若要遵循本文中的範例,如果您熟悉可延伸的應用程式標記語言(XAML),並知道如何撰寫 Windows Presentation Foundation (WPF) 應用程式,它很有説明。

語法

使用 Handles 關鍵字之宣告的 Sub 語法為: Sub <procedure name> Handles <object name>.<event name> 該語法會將程式指定為事件處理常式,這個事件處理常式會在 所 <event name><object name> 指定的 物件上引發 所指定的事件時執行。 事件必須是物件類別或基類的成員。 下列範例示範如何使用 將事件處理常式附加至 XAML 元素 Handles

' 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 元素具有 Name x:Name 屬性。 不過,XAML 頁面根項目不需要 name 屬性,您可以使用名稱 Me 。 下列範例示範如何使用 將事件處理常式附加至 XAML 頁面根目錄 Handles

' 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 。 因此,您可以搭配 Handles 使用任何 XAML 元素。

提示

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) 方法附加事件處理常式,並將其參數設定 handledEventsTootrue

另請參閱