WPF的路由事件、冒泡事件

WPF的路由事件、冒泡事件


开发工具与关键技术:Visual Studio+WPF
作者:奉平花
撰写时间:2019年04月14日


1:什么是路由事件
WPF中的事件为路由事件,所谓路由事件,MSDN定义如下:
功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件。
实现定义:路由事件是一个 CLR 事件,可以由 RoutedEvent 类的实例提供支持并由 Windows Presentation Foundation (WPF) 事件系统来处理。
但这两类定义都比较抽象,我们来看更具体的定义:
WPF的路由事件、冒泡事件

TextBlock -->StackPanel–>Border —>…
一、路由事件一:逻辑树和可视树
什么是逻辑树
逻辑树就是描述WPF界面元素的实际构成,它是由程序在XAML中所有的UI元素组成。最显著的特点就是由布局控件、或者其他常用的控件组成。
从上面的代码中可以看出,Window、Grid、StackPanel、TextBox其实就是XAML界面的逻辑树。
什么是可视树
可视树是由界面上可见的元素构成的,这些元素主要是由从Visual或者Visual3D类中派生出来的类。
上面代码中的Window、Grid、StackPanel、TextBox它们本身就包含一些由Visual或者Visual3D类派生出的一些可视树的元素来组成的。
二、逻辑树和可视树的遍历
逻辑树遍历使用LogicalTreeHelper类。
可视树遍历使用VisualTreeHelper类。
演示遍历逻辑树和可视树
1、 XAML界面左边显示逻辑树,右边显示可视树,代码如下
WPF的路由事件、冒泡事件
2.中断事件路由 所有的路由事件都共享一个公共的事件数据基类 RoutedEventArgs。 RoutedEventArgs 定义了一个采用布尔值的 Handled 属性。 Handled 属性的目的在于,允许路由中的任何事件处理程序通过将 Handled 的值设置为 true 来将路由事件标记为“已处理”。
WPF的路由事件、冒泡事件
在本文一开始的例子中,如果我们将MouseUP,改为PreviewMouseUP,效果会如何呢。
区别:
冒泡事件:在YesTB上点击,首先弹出“button”,再弹出“panel”。
预览事件(隧道事件)事件:在YesTB上点击,首先弹出“panel”,再弹出“button”。
看到了这点区别,那么我们加入e.Handled=true的时机也要不同。首先,
冒泡事件例子中:e.Handled=true加在YesTB_PreviewMouseUp中,加入后,点击YesTB,将只弹出“button”。
预览事件(隧道事件)例子中:e.Handled=true家在StackPanel_PreviewMouseUp中,加入后,点击YesTB,将只弹出“panel”。