1、配置事件和事件处理(Configuring Events and Event Handling)
事件在WPF编程是明显不同于那些在传统的Windows窗体的编程。WPF使用路由事件,可以存在多个控制和多个处理程序。路由事件允许您添加多个层次的复杂性和复杂的用户界面,响应用户输入。学习路由事件,包括如何处理一个路由事件,定义和注册一个新的路由事件,处理应用程序生命周期事件,并使用EventManager类。
1.1 下面使用一个实例说明如何定义、注册、封装路由事件
public abstract class ButtonBase: ContentControl,... { //定义事件 public static readonly RoutedEvent ClickEvent; //注册事件(需要指定事件的名称、路由类型、事件处理程序语法的委托以及拥有该事件的类) static ButtonBase() { ButtonBase.ClickEvent=EventManager.RegisterRoutedEvent("Click",RoutingStrategy.Bubble, typeof(RoutedEventHandler),typeof(ButtonBase)); ... } //事件的封装 public event RoutedEventHandler Click { add { base.AddHandler(ButtonBase.ClickEvent,value); } remove { base.RemoveHandler(ButtonBase.ClickEvent,value); } } }
1.2、三种路由事件:直接路由事件、冒泡路由事件、隧道路由事件
直接路由事件:与普通的.net事件类似,它们源于同一个元素,不传递给其他元素。例如,MouseEnter事件(当鼠标移到元素时发生)是直接路由事件
冒泡路由事件:在包含层次中向上传递的事件,例如事件由某一元素引发,然后被该元素的父元素引发,然后被父元素的父元素引发,一直到WPF到达元素树的顶部为止
隧道路由事件:在包含层次中向下传递的事件,它为控件的预览事件提供了机会。
RoutedEventArgs类的属性
.Source :指示引发了事件的对象
.OriginalSource: 指示了最初是什么对象引发了事件
.RoutedEvent:通过事件处理程序为触发的事件提供RountEvent对象
.Handled: 属性值为true时,该属性终止事件的冒泡或者隧道过程。
1.3、EventManager类
EventManager 是管理所有WPF 路由事件注册的静态类
EventManager 类的方法:
.GetRoutedEvents:返回应用程序中被注册的所有的路由事件
.GetRoutedEventsForOwner:返回应用程序中所有被注册的特殊元素的路由事件
.RegisterClassHandler:注册一个类级别的事件处理程序
.RegisterRoutedEvent: 注册一个实例级别的事件处理程序
2、配置命令(Configuring Commands)
WPF 命令增加了两个重要的特性,1)、将事件委托到适当的命令;2)、使控件的启用状态和相应命令的状态保持同步。
如图所示:
WPF对以下几个方面没有提供任何支持:
.命令跟踪(保留最近命令历史)
.“可撤销命令”
.具备状态并可处于不同模式的命令。