共用方式為


Visual Basic 和 WPF 事件處理

更新:2007 年 11 月

您可特別針對 Microsoft Visual Basic .NET 語言,使用語言特定 Handles 關鍵字建立事件處理常式與執行個體的關聯,而不必附加事件處理常式和屬性 (Attribute),或是使用 AddHandler 方法。不過,將處理常式附加至執行個體的 Handles 技巧需受到某些限制,因為 Handles 語法不能支援 WPF 事件系統的某些特定路由事件功能。

在 WPF 應用程式中使用 "Handles"

使用 Handles 連接至執行個體和事件的事件處理常式全都必須在執行個體的部分類別宣告 (Class Declaration) 內定義,而這項需求條件也適用於透過項目屬性值指派的事件處理常式。您只能為頁面上具有 Name 屬性值 (或已宣告 x:Name 屬性) 的項目指定 Handles。這是因為 XAML 中的 Name 會建立支援 Handles 所需 Instance.Event 參考格式的必要執行個體參考。可用於沒有 Name 參考的 Handles 唯一一個項目是定義部分類別的根項目執行個體。

您可以使用逗號分隔 Handles 後面的 Instance.Event 參考,將相同的處理常式指派給多個項目。

您可以使用 Handles 將一個以上的處理常式指派給同一個 Instance.Event 參考。請勿針對在 Handles 參考中指定事件常式的順序指定任何重要性;您應該假設處理相同事件的處理常式可以按照任何順序來叫用 (Invoke)。

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

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

使用 "Handles" 加入事件處理常式的限制

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

對於路由事件,您只能使用 Handles,針對事件存在執行個體成員表中的執行個體,指派其處理常式。不過,對於一般路由事件,父項目可以是子項目傳回事件的接聽程式 (Listener),即使父項目在其成員表中沒有該事件也一樣。在屬性 (Attribute) 語法中,您可以透過 typename.membername 屬性格式,限定實際定義您要處理之事件的型別,以指定這項功能。例如,父代 Page (未定義 Click 事件) 可以透過指派 Button.Click 格式的屬性接聽常式,接聽按一下按鈕的事件。但是 Handles 不支援 typename.membername 格式,因為它必須支援衝突的 Instance.Event 格式。如需詳細資訊,請參閱路由事件概觀

Handles 無法附加針對已經標記為已處理之事件所叫用的處理常式。您必須改用程式碼並呼叫 AddHandler(RoutedEvent, Delegate, Boolean) 的 handledEventsToo 多載 (Overload)。

WPF 實作 "Handles" 功能的方式

編譯可延伸標記語言 (XAML) 頁面時,中繼檔案會宣告頁面上已設定 Name 屬性 (或是已宣告 x:Name 屬性) 之每個項目的 FriendWithEvents 參考。每個具名執行個體都有可能是可以透過 Handles 指派至處理常式的項目。

注意事項:

在 Microsoft Visual Studio 內,IntelliSense 可以顯示頁面中適用於 Handles 參考的項目完成狀態。不過,這可能會採用一個編譯傳遞,使中繼檔案能夠填入 (Populate) 所有的 Friends 參考。

請參閱

概念

將路由事件標記為已處理以及類別處理

路由事件概觀

XAML 概觀

參考

AddHandler