WPF中的事件为路由事件。
功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事 件的对象)调用处理程序的事件。
实现定义:路由事件是一个 CLR 事件,可以由 RoutedEvent 类的实例提供支持并由 WPF事件系统来处理。
中断事件路由:
所有的路由事件都共享一个公共的事件数据基 类 RoutedEventArgs。 RoutedEventArgs 定义了一个采用布尔值的 Handled 属 性。 Handled 属性的目的在于,允许路由中的任何事件处理程序通过将 Handled 的值设 置为 true 来将路由事件标记为“已处理”。
在上面的例子中,将不再触发StackPanel_MouseUp事件。
路由事件,之所以叫“路由”,最主要在于其事件传递的特殊性;
在注册事件时,通过 RoutingStrategy枚举,可以使用三种方式传递事件
- RoutingStrategy.Bubble(冒泡路由事件)
沿UI可视树往上传递。例如,MouseDown事件就是一个冒泡路由事件。它首先被单击 的元素触发,接下来就是该元素的父元素触发,依此类推,直到WPF到达元素树的顶部为止
- RoutingStrategy.Tunnel(隧道路由事件)
沿UI可视树往下传递,例如PreviewKeyDown就是一个隧道路由事件。在一个窗口上按 下某个键,首先是窗口,然后是更具体的容器,直到到达按下键时具有焦点的元素
- RoutingStrategy.Direct(直接路由事件) 与普通的.NET事件类似,只传递一层。它源自一个元素,并且不传递给其他元素。例 如,MouseEnter事件(当鼠标移动到一个元素上面时触发)就是一个直接路由事件