Visual Basic 和 WPF 事件處理

針對 Microsoft Visual Basic .NET 語言,您可以使用語言特定 Handles 關鍵字,將事件處理常式與實例產生關聯,而不是將 AddHandler 事件處理常式附加至屬性或使用 方法。 不過, Handles 將處理常式附加至實例的技術確實有一些限制,因為 Handles 語法無法支援 WPF 事件系統的某些特定路由事件功能。

在 WPF 應用程式中使用「Handles」

使用 Handles 連線到執行個體和事件的事件處理常式全需定義於執行個體的部分類別宣告中,這也是透過元素上的屬性值所指派之事件處理常式的需求。 您只能針對頁面上已 Name 宣告屬性值 (或 x:Name 指示詞 ) 的專案指定 Handles 。 這是因為 Name XAML 中的 會建立實例 參考,以支援語法所需的 Handles Instance.Event 參考格式。 唯一 Name 可以用於 Handles 不含參考的專案是定義部分類別的根項目實例。

您可以將相同的處理常式指派給多個元素,方法是在 Handles 之後使用逗號來隔開 Instance.Event 參考。

您可以使用 Handles,將多個處理常式指派給同一個 Instance.Event 參考。 不要為 Handles 參考中指定處理常式的順序指派任何重要性;您應該假設可以任何順序叫用處理同一個事件的處理常式。

若要移除宣告中加入 的 Handles 處理常式,您可以呼叫 RemoveHandler

您可以使用 Handles 來附加路由事件的處理常式,只要您將處理常式附加至會在其成員資料表中定義要處理事件的執行個體。 針對路由事件,附加 的 Handles 處理常式會遵循與附加為 XAML 屬性的處理常式相同的路由規則,或具有 的通用簽章 AddHandler 。 這表示如果事件已標示為已處理( Handled 事件資料中的 屬性), True 則不會叫用附加的 Handles 處理常式來回應該事件實例。 事件可能是透過路由中另一個元素上的執行個體處理常式標示為已處理,或是透過路由上目前元素或先前元素上所處理的類別來標示。 對於支援配對的通道/事件反昇事件的輸入事件,通道路由可能已將事件配對標示已處理。 如需路由事件的詳細資訊,請參閱路由事件概觀

加入處理常式的「Handles」限制

Handles 不能參考附加事件的處理常式。 您必須 add 使用該附加事件的存取子方法,或 XAML 中的 typename.eventname 事件屬性。 如需詳細資訊,請參閱路由事件概觀

針對路由事件,您只能使用 Handles 來指派執行個體的處理常式,該事件存在於執行個體成員資料表中。 不過,透過路由事件,父元素通常可以是來自子元素之事件的接聽程式,即使父元素的成員資料表中沒有該事件也一樣。 在屬性語法中,您可以透過 typename.membername 屬性格式來指定此動作,此格式會限定哪種類型實際上會定義您想要處理的事件。 例如,父 Page 代(未 Click 定義任何事件)可以藉由在 表單 Button.Click 中指派屬性處理常式來接聽按鈕點擊事件。 但是 Handles 不支援 typename.membername 格式,因為它必須支援衝突的 Instance.Event 格式。 如需詳細資訊,請參閱路由事件概觀

Handles 無法附加要針對已經標示為已處理之事件叫用的處理常式。 相反地,您必須使用程式碼並呼叫 handledEventsToo 的多 AddHandler(RoutedEvent, Delegate, Boolean) 載。

注意

當您在 XAML 中指定相同事件的事件處理常式時,請勿在 Handles Visual Basic 程式碼中使用 語法。 在這個情況下,會呼叫事件處理常式兩次。

WPF 如何實作「Handles」功能

編譯 Extensible Application Markup Language (XAML) 頁面時,中繼檔案會 FriendWithEvents 宣告頁面上每個已 Name 宣告屬性集 (或 x:Name 指示詞 ) 的參考。 每個具名執行個體可能都是可透過 Handles 指派給處理常式的元素。

注意

在 Visual Studio 中,IntelliSense 可以顯示您可以在頁面中取得 Handles 參考的專案完成。 不過,這可能需要採取一次編譯傳遞,讓中繼檔案可以填入所有的 Friends 參考。

另請參閱