共用方式為


Visual Basic 和 WPF 事件處理

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

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

使用 Handles 連線到執行個體和事件的事件處理常式全需定義於執行個體的部分類別宣告中,這也是透過元素上的屬性值所指派之事件處理常式的需求。 您只能在含有 Handles 屬性值 (或已宣告 Name) 的頁面上為元素指定 。 這是因為 Name 中的 XAML 會建立執行個體參考,需要有此參考才能支援 語法所需的 Handles 參考格式。 唯一可在沒有 Handles 參考的情況下用於 Name 的元素是定義部分類別的根元素執行個體。

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

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

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

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

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

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

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

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

注意

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

WPF 如何實作「Handles」功能

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

注意

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

另請參閱