代码改变世界

WPF 路由事件(一)

2013-03-28 14:34  残月星辰  阅读(1151)  评论(1编辑  收藏  举报

1. 定义、注册、包装路由事件

WPF事件模型与WPF属性模型类似,在依赖项属性一样,路由事件由只读的静态字段表示,在一个静态构造函数中注册,并且通过一个标准的.NET事件定义进行包装。

例如 Button类提供了熟悉的CLick事件,该事件继承来自抽象的ButtonBase基类,下面的代码说明了该事件是如何被定义和注册的:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Windows;
 6 using System.Windows.Controls;
 7 
 8 namespace SCADA.HMI.Windows
 9 {
10    public abstract class ButtonBase :ContentControl
11    {
12 
13        /// <summary>
14        /// 定义事件
15        /// </summary>
16        public static readonly RoutedEvent ClickEvent;
17        /// <summary>
18        /// 注册事件
19        /// </summary>
20        static ButtonBase()
21        {
22            ButtonBase.ClickEvent = EventManager.RegisterRoutedEvent
23                ("Click", RoutingStrategy.Bubble,
24                 typeof (RoutedEventHandler),
25                 typeof (ButtonBase));
26        }
27 
28        /// <summary>
29        /// 添加删除已注册的调用程序
30        /// </summary>
31        public event RoutedEventHandler Click
32        {
33            add { AddHandler(ButtonBase.ClickEvent,value); }
34            remove { RemoveHandler(ButtonBase.ClickEvent,value); }
35        }
36    }
37 }

总结:虽然依赖项属性时使用DependencyProperty.Register()方法注册,而路由事件是使用EventManager.RegisterRoutedEvent()方法注册的。当注册事件时,

需要指定事件的名称、路由类型、定义事件处理程序语法的委托以及拥有该事件的类。

通常,路由事件通过普通的.NET事件进行包装,从而使所有.Net语言都能够访问他们。事件包装器可以使用AddHandler()和RemoveHander()添加和删除已注册的调用程序,

这两种方法都是在FrameWorkElement基类中定义的并被WPF元素继承。

(未完待续.......)