导出 (0) 打印
全部展开
信息
您所需的主题如下所示。但此主题未包含在此库中。

UIElement.AddHandler 方法

2013/12/13

为指定的路由事件添加路由事件处理程序,并将该处理程序添加到当前元素的处理程序集合中。将 handledEventsToo 指定为 true 时,可为已标记为由其他元素在事件路由过程中处理的路由事件调用所提供的处理程序。

Namespace:  System.Windows
程序集:  System.Windows(位于 System.Windows.dll 中)

public void AddHandler(
	RoutedEvent routedEvent,
	Delegate handler,
	bool handledEventsToo
)

参数

routedEvent
类型: System.Windows.RoutedEvent
要处理的路由事件的标识符。
handler
类型: System.Delegate
对处理程序实现的引用。
handledEventsToo
类型: System.Boolean
如果为 true,则将按以下方式注册处理程序:即使路由事件在其事件数据中标记为已处理,也会调用该处理程序;如果为 false,则使用默认条件注册处理程序,即当路由事件已标记为已处理时,将不调用该处理程序。默认值为 false。不要例行地请求重新处理路由事件。有关更多信息,请参见“备注”。

异常条件
ArgumentNullException

routedEvent handlernull.

ArgumentException

routedEvent 不表示支持的路由事件。

- 或 -

handler 不实现支持的委托。

NotImplementedException

试图为当前平台的变体不支持的事件添加处理程序。

用一种切实可行的方法处理低级输入事件是一项非常复杂的任务。许多控件所实施的行为是,将某个特定事件标记为已处理并将其替换为另一个更直观的事件。通常,如果某个设计意图要求仅将路由事件标记为已处理,控件会这样做。但是,在某些情况下,这些设计意图可能并不符合您对输入事件的特殊处理要求。需要在 handledEventsTootrue 的情况下注册处理程序就属于此类情况。但是,不应例行地执行此操作。如果即使事件被标识为已处理,也要调用处理程序来响应所有事件,则会使您自己的应用程序事件处理逻辑变得非常复杂。如果存在大量的处理程序逻辑,则会降低性能。在开发过程中,如果发现某些控件正在处理您仍希望使用应用程序和用户代码逻辑来处理的事件,则只能将处理程序赋给已处理的事件。

避免特定事件控件组合的类处理行为的另一项技术是为该控件创建子类并重写其 On* 类方法,这是该控件用来将事件标记为已处理的特定代码路径。但是,这也可能非常复杂。您可能需要在不调用基类的情况下重新生成给定控件的处理实现,因为基类会将事件标记为已处理。

要使用 AddHandler,路由事件必须公开作为事件标识符的公共静态字段,这是 routedEvent 参数所必需的。这只对核心类中的有限事件集成立。

请勿使用 FrameworkElement.LoadedAddHandlerFrameworkElement.Loaded 不是 Windows Phone 实现中真正的路由事件。MouseMove 不能与 AddHandler 一起使用,因为事件数据中不存在 HandledFrameworkElement.BindingValidationError 不能与 AddHandler 一起使用,因为不存在事件标识符且不存在处理该事件的控件。

可以多次为同一事件添加相同的处理程序,而不会引发异常。但是,在处理该事件时实际上会多次调用该处理程序。因此,需要考虑此行为可能会产生哪些副作用,在处理程序实现中应解决这些副作用。

下面的示例演示了路由事件的处理程序实现 (KeyDown) 和一个 Loaded 事件处理程序(它将该 KeyDown 处理程序附加到 XAML 定义的页面的根元素)。此时不使用 += 语法,而是通过将 handledEventsToo 设置为 true 来调用 AddHandler。这样,就可以通过事件路由将有关 CapsLock 键的任何使用报告给根元素,即使在诸如 TextBox 的控件对于 KeyDown / OnKeyDown 实现具有控件特定的处理时也不例外。

    // Assumes the UI has a TextBox that can pop-up the keyboard defined as a child of LayoutRoot, and a 
    // TextBlock named textBlock1 that can display text onscreen.
    public partial class MainPage : PhoneApplicationPage
    {
        // Constructor
        public MainPage()
        {
            InitializeComponent();
            LayoutRoot.Loaded +=new RoutedEventHandler(Load_Main);
        }

        private void Load_Main(object sender, RoutedEventArgs e)
        {
            UIElement target = sender as UIElement;
            target.AddHandler(UIElement.KeyDownEvent, new KeyEventHandler(LayoutRoot_KeyDown), true);
        }

        private void LayoutRoot_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.PlatformKeyCode == 233)
            {
                textBlock1.Text = "Caps Lock!";
            }
        }
    }


Windows Phone OS

受以下版本支持: 8.0, 7.1, 7.0

Windows Phone

显示:
© 2014 Microsoft