UIElement.AddHandler(RoutedEvent, Object, Boolean) 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
為指定的路由事件新增一個路由事件處理器,並將該處理器加入目前元素的處理器集合中。 指定handledEventsTootrue即使事件在其他地方處理,也能呼叫所提供的處理器。
public:
virtual void AddHandler(RoutedEvent ^ routedEvent, Platform::Object ^ handler, bool handledEventsToo) = AddHandler;
void AddHandler(RoutedEvent const& routedEvent, IInspectable const& handler, bool const& handledEventsToo);
public void AddHandler(RoutedEvent routedEvent, object handler, bool handledEventsToo);
function addHandler(routedEvent, handler, handledEventsToo)
Public Sub AddHandler (routedEvent As RoutedEvent, handler As Object, handledEventsToo As Boolean)
參數
- routedEvent
- RoutedEvent
一個用於處理路由事件的識別碼。
- handler
-
Object
Platform::Object
IInspectable
這是對處理器實作的參考。
- handledEventsToo
-
Boolean
bool
true 註冊處理程序,使其即使在路由事件在其事件資料中標記為已處理時,也能被呼叫。
false 註冊處理程序時,預設條件是若路由事件已被標記為已處理,則不會呼叫該處理程序。 預設值為 false。
請勿例行請求重新處理路由事件,因為這會干擾 Windows 執行階段 事件系統用於控制合成的預期設計。
範例
此範例展示了將事件處理程序AddHandlerhandledEventsToo與 連接為 true的基本語法。 此時被布線事件為 Tapped。 典型的連接處理方式是頁面的 Loaded 或模板控制項的 OnApplyTemplate 。
void MainPage::pageRoot_Tapped(Platform::Object^ sender, Windows::UI::Xaml::Input::TappedRoutedEventArgs^ e)
{
//implementation
}
void MainPage::pageRoot_Loaded(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
this->AddHandler(UIElement::TappedEvent, ref new TappedEventHandler(this, &MainPage::pageRoot_Tapped), true);
}
private void pageRoot_Tapped(object sender, TappedRoutedEventArgs e)
{
//implementation
}
private void pageRoot_Loaded_1(object sender, RoutedEventArgs e)
{
this.AddHandler(UIElement.TappedEvent, new TappedEventHandler(pageRoot_Tapped), true);
}
備註
不要試圖 AddHandler 用它來取代你平常用來連接事件處理程式的語言特定語法;這行不通,因為並非所有事件都有你可以傳遞的 routedEvent識別碼。
AddHandler 專門用於路由事件,主要針對通過 handledEventsToo 為 true所啟用的特定情境。 如需詳細資訊,請參閱事件與路由事件概觀。
路由事件識別碼
路由事件識別碼通常是 UIElement 的靜態屬性成員。 例如,要為 KeyUp 事件新增處理器,請傳遞 KeyUpEvent 以取得此參數。 只有少數 Windows 執行階段 事件擁有此識別碼;只有 UIElement 上的路由事件才有可用於此用途的識別碼 API。 這些通常是與不同層級輸入動作相關的事件:指標層級、手勢層級、操作層級。 此外,金鑰輸入事件也可以用這種方式處理。
以下是一串路由事件,這些事件會暴露路由事件識別碼,因此可由透過呼叫註冊 AddHandler 的處理器處理:
- 雙重敲擊
- 拖入
- 拖曳離開
- DragOver
- 放棄
- 判決
- KeyDown
- KeyUp
- 操控完成
- 操控三角洲
- 操控慣性啟動
- 操控開始
- 操作開始
- PointerCanceled
- 指向捕獲失落
- PointerEntered
- PointerExited
- PointerMoved
- PointerPressed
- Pointer已發布
- 指輪變換
- 正確點擊
- 被敲定
處理參數
這個 handler 參數是未型別的參數,但你應該提供一個新的代理,參考一個針對特定事件的處理方法。 例如,若處理 KeyUp 事件,則傳遞一個新的 KeyEventHandler 實例,該實例參考基於該 KeyEventHandler 代理簽章的方法。 這需要一個 dereference 功能,而 dereference 語法會依你使用的語言而有所不同。 請參考本主題中的範例。
何時使用 handledEventsToo
實際處理低階輸入事件是一項複雜的任務。 許多控制項實作行為,將某事件標記為處理中,並被另一個更直覺的事件取代。 一般來說,控制項只有在有設計意圖時,才會標記路由事件為已處理。 然而,在某些情況下,這些設計意圖可能不是你處理輸入事件時所需要的。 在這些情境下,註冊處理者handledEventsTootrue才是適當的。 但你不應該經常這樣做。 即使所有事件都已處理,仍要呼叫處理器,會讓你自己的應用程式事件處理邏輯變得複雜。 如果處理器邏輯很複雜,效能可能會下降。 只有當你發現某些控制項正在處理你想用應用程式邏輯處理的事件時,才應該把處理器附加到已經處理過的事件上。
另一種避免控制項類別處理行為的方法是將控制項子類別並覆寫其 OnEvent 方法,這些方法是預先設定的覆蓋,控制項會將事件標記為已處理。 然而,這也可能相當複雜。 你可能需要在不呼叫基礎實作的情況下,重現控制項的處理實作,因為基礎實作會將事件標記為已處理。 如需詳細資訊,請參閱事件與路由事件概觀。