WPF基础之路由事件(二)

路由事件处理程序和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)要求所引用的事件是路由事件。

路由事件支持类处理机制,类可以凭借该机制来指定静态方法,这些静态方法能够在任何已注册的实例程序访问路由事件之前,处理这些路由事件。这在控件设计中非常有用,因为您的类可以强制执行事件驱动的行为,以防它们在处理实例上的事件时被意外禁止。

实在看不下去了,感冒头晕脑胀的

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值