UIElement.AddHandler(RoutedEvent, Object, Boolean) 方法

定義

加入所指定路由事件的路由事件處理常式,會將此處理常式加入目前項目的處理常式集合中。 將 handledEventsToo 指定為 true ,以便叫用提供的處理常式,即使事件是在其他地方處理也一樣。

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 執行階段事件系統的預期設計,以進行控制組合。

範例

此範例示範使用 AddHandler 和 handledEventsToo 作為 true來連接事件處理常式的基本語法。 在此情況下,正在有線的事件是 點選。 連線處理常式的一般位置是 針對頁面載入 ,或是範本化控制項的 OnApplyTemplate

void MyControl::MyPointerPressedHandler(
    winrt::Windows::Foundation::IInspectable const &sender,
    winrt::Windows::UI::Xaml::Input::PointerRoutedEventArgs const& e) {
  // implementation..
}

this->AddHandler(
    winrt::Windows::UI::Xaml::UIElement::PointerPressedEvent(),
    winrt::box_value(winrt::Windows::UI::Xaml::Input::PointerEventHandler(this, &MyControl::MyPointerPressedHandler)),
    true);

// Or passing the handler as a lambda, instead of a member function:
this->AddHandler(
    winrt::Windows::UI::Xaml::UIElement::PointerPressedEvent(),
    winrt::box_value(winrt::Windows::UI::Xaml::Input::PointerEventHandler(
      [=](auto &&, winrt::Windows::UI::Xaml::Input::PointerRoutedEventArgs const &args) {
      // ...
    })),
    true);    
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);
}
Private Sub Page_Tapped(sender As Object, e As TappedRoutedEventArgs)
    ' implementation
End Sub
Private Sub Page_Loaded_1(sender As Object, e As RoutedEventArgs)
    Me.AddHandler(UIElement.TappedEvent, New TappedEventHandler(AddressOf Page_Tapped), True)
End Sub

備註

請勿嘗試使用 AddHandler 做為通常用於連接事件處理常式的語言特定語法的一般替代專案;它無法運作,因為並非所有事件都有可傳遞為 routedEvent的識別碼。 AddHandler 特別適用于路由事件,主要適用于傳遞 handledEventsToo 作為 true所啟用的特定案例。 如需詳細資訊,請參閱事件與路由事件概觀

路由事件識別碼

路由事件識別碼通常是 UIElement的靜態屬性成員。 例如,若要新增 KeyUp 事件的處理常式,請傳遞此參數的 KeyUpEvent 。 只有少數Windows 執行階段事件具有此識別碼;只有UIElement上的路由事件具有可供此使用方式的識別碼 API。 這些通常是與各種層級的輸入動作相關的事件:指標層級、手勢層級、操作層級。 此外,也可以以這種方式處理索引鍵輸入事件。

以下是公開路由事件識別碼的路由事件清單,因此可由 AddHandler 呼叫所註冊的處理常式處理:

處理常式參數

處理常式參數是不具類型的參數,但您應該提供參考所需事件專屬之處理常式方法的新委派。 例如,如果處理 KeyUp 事件,請傳遞新的 KeyEventHandler 實例,以參考以 該 KeyEventHandler 委派簽章為基礎的方法。 這需要取值,而取值語法會根據您使用的語言而有所不同。 請參閱本主題中的範例。

使用handledEventsToo 的時機

以實用的方式處理低階輸入事件是複雜的工作。 許多控制項會實作特定事件標示為已處理的行為,並由另一個更直覺的事件取代。 一般而言,只有在有一些設計目的要這麼做時,控制項才會將路由事件標示為已處理。 不過,在某些案例中,這些設計意圖可能不是您特定處理輸入事件所需的目的。 在註冊 handledEventsToo 的處理常式時,適用于 這些 案例。 但您不應該定期這麼做。 叫用處理程式以回應所有事件,即使已處理,也會使您自己的應用程式事件處理邏輯複雜。 如果處理常式邏輯很大,您可能會看到效能降低。 只有在發現某些控制項正在處理您想要使用應用程式邏輯處理的事件時,才應該將處理常式附加至已處理的事件。

另一種避免控制項的類別處理行為的技術是子類別,該子類別控制並覆寫其 OnEvent 方法,這些方法是預先設定的覆寫,控制項會將事件標示為已處理。 不過,這也可能十分複雜。 您可能必須重現控制項的處理實作,而不呼叫基底實作,因為基底實作會將事件標示為已處理。 如需詳細資訊,請參閱事件與路由事件概觀

適用於

另請參閱