路由事件处理程序和XAML
若要使用XAML为某个事件添加处理程序,请将该事件的名称声明为用作事件侦听器的元素上的属性。该属性的值是所实现的处理程序方法的名称,该文件必须存在于代码隐藏文件的分部类中。
<Button Click="blSetColor">button</Button>
用来添加标准CLR事件处理程序的XAML语法与用来添加路由事件处理程序的语法相同,因为您实际上是在向下面具有路由事件实现的CLR事件包装中添加处理程序。
路由策略
路由事件使用以下三个路由策略之一
冒泡:针对事件源调用事件处理程序。路由事件随后会路由到后续的父元素,直到到达元素树的根。大多数路由事件都使用冒泡路由策略。冒泡路由事件通常用来报告来自不同控件或其他UI元素的输入或状态变化。
直接:只有源元素本身才有机会调用处理程序以进行响应。这与Windows窗体用于事件的“路由”相似。但是,与标准CLR事件不同的是,直接路由事件支持类处理而且可以由EventSetter和EventTrigger使用。
隧道:最初将在元素树的根处调用事件处理程序。随后,路由事件将朝着路由事件的源节点元素(即引发路由事件的元素)方向,沿路由线路传播到后续的子元素。在合成控件的过程中通常会使用或处理隧道路由的事件,这样,就可以有意地禁止显示复合部件中的事件,或者将其替换为特定于整个控件的事件。在WPF中提供的输入事件通常是以隧道/冒泡对实现的。隧道事件有时又称作Preview事件,这是由隧道/冒泡对所使用的命名约定决定的。
为什么使用路由事件?
作为应用程序开发人员,您不需要始终了解或关注正在处理的事件是否作为路由事件实现。路由事件具有特殊的行为,但是,如果您在引发该行为的元素上处理事件,则该行为通常会不可见。
如果您使用以下任一建议方案,l路由事件的功能将得到充分发挥:在公用根处定义公用处理程序、合成自己的控件或定义您自己的自定义控件类。
路由事件侦听器和路由事件源不必在其层次结构中共享公用事件。任何UIElement或ContentElement可以是任一路由事件的事件侦听器。因此,您可以使用在整个工作API集内可用的全套路由事件作为概念“接口”,应用程序中的不同元素凭借这个接口来交换事件信息。路有事件的这个“接口”概念特别适用于输入事件。
路由事件还可以用来通过元素树进行通信,因为事件的事件数据会永存到路由中的每个元素中。一个元素可以更改事件中的某项内容,该更改将对于路由中的下一个元素可用。
之所以将任何给定的WPF事件作为路由事件的实现(而不是作为标准CLR事件实现),除了路由方面的原因,还有两个其他原因。如果您要实现自己的事件,则可能也需要考虑这两个因素:
某些WPF样式和模板功能(eg.EventSetter、EventTrigger)要求所引用的事件是路由事件。
路由事件支持类处理机制,类可以凭借该机制来指定静态方法,这些静态方法能够在任何已注册的实例程序访问路由事件之前,处理这些路由事件。这在控件设计中非常有用,因为您的类可以强制执行事件驱动的行为,以防它们在处理实例上的事件时被意外禁止。
实在看不下去了,感冒头晕脑胀的