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 的基本语法。 在这种情况下,正在连接的事件是 点击。 连接处理程序的典型位置是页面 的 Loaded 或模板化控件的 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

以实际方式处理低级别输入事件是一项复杂的任务。 许多控件实现的行为,其中某个事件被标记为已处理,并替换为另一个更直观的事件。 通常,控件仅当存在一些设计意图时才将路由事件标记为已处理。 但是,在某些情况下,这些设计意图可能不是对输入事件的特定处理所需的。 对于这些方案,将处理程序注册 到 handledEventsTootrue 是合适的。 但不应例行公事地执行此操作。 调用处理程序以响应所有事件(即使已处理)会使你自己的应用事件处理逻辑复杂化。 如果处理程序逻辑很大,则性能可能会下降。 仅当发现某些控件正在处理你想要使用应用逻辑处理的事件时,才应将处理程序附加到已处理的事件。

避免控件的类处理行为的另一种方法是子类,该类控制并重写其 OnEvent 方法,这些方法是预配置的替代,控件通过该替代将事件标记为已处理。 但是,这也可能是复杂的。 可能需要在不调用基实现的情况下重现控件的处理实现,因为基本实现会将事件标记为已处理。 有关详细信息,请参阅事件和路由事件概述

适用于

另请参阅