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

定义

为指定的路由事件添加路由事件处理程序,并将该处理程序添加到当前元素的处理程序集合中。 指定 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 运行时事件系统的预期设计,以便进行控制组合。

示例

此示例演示使用 和 handledEventsToo 作为 true连接事件处理程序AddHandler的基本语法。 在这种情况下,正在连接的事件是 点击。 连接处理程序的典型位置是页面 的 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 专用于路由事件,主要用于通过将 传递 handledEventsTootrue来启用的特定方案。 有关详细信息,请参阅事件和路由事件概述

路由事件标识符

路由事件标识符通常是 UIElement 的静态属性成员。 例如,若要为 KeyUp 事件添加处理程序,请为此参数传递 KeyUpEvent 。 只有少数Windows 运行时事件具有此标识符;只有 UIElement 上的路由事件具有可用于此用途的标识符 API。 这些通常是与不同级别的输入操作相关的事件:指针级别、手势级别、操作级别。 此外,可以通过这种方式处理键输入事件。

下面是一个路由事件列表,这些事件公开路由事件标识符,因此可由调用注册 AddHandler 的处理程序进行处理:

处理程序参数

参数 handler 是非类型化参数,但应提供引用特定于所需事件的处理程序方法的新委托。 例如,如果处理 KeyUp 事件,请传递一个新的 KeyEventHandler 实例,该实例引用基于该 KeyEventHandler 委托签名的方法。 这需要取消引用,取消引用语法因使用的语言而异。 请参阅本主题中的示例。

何时使用 handledEventsToo

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

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

适用于

另请参阅