路由事件 RoutedEvent
定义
1.它可以在元索树上向上冒泡和向下隧道传播,并且沿若传播路径被事件处理程序处理base.RaiseEvent(e);
2.通过RaiseEvent方法触发路由事件
3.RoutingStrategy枚举值来标识希望应用于事件的事件行为(Direct, Bubble, Tunnel)
直接路由事件
不传递:它源自一个元素,并且不传递给其他元素。例如,MouseEnter事件(当鼠标移动到-个元素上面时触发)就是一一个直接路由事件。
冒泡事件
向上传递: 例如,MouseDown事件就是一 一个冒泡路由事件。它首先被单击的元素触发,接下来就是该元素的父元素触发, 依此类推,直到PF到达元素树的顶部为止。
隧道事件
向下传递:例如PrevievKeyDown就是 一个隧道路由事件。在一个窗口上按下某个键,首先是窗口,然后是更具体的容器,直到到达按下键时具有焦点的元素。
附加事件
1.
假设有这样一个场景,StackPanel面板中包含了一堆按钮,并且希望在一个事件处理程序中处理所有这些按钮的单击事件。首先想到的办法就是将每个按钮的Click事件关联到同一个事件处理程序。但是Click事件支持事件冒泡,从而有一种更好的解决办法。可以在更高层次元素来关联Click事件来处理所有按钮的单击事件
2.
其他
1
如果想在某层之后阻止事件发生/如果想阻止事件传递(前面理解对,效果一样)
RoutedEventArgs. Handled=true, 此时传递是继续发生的,但是事件不去处理了
2
隧道路由事件总是在冒泡路由事件之前被触发。
3
如果将隧道路由事件标记为已处理的,那么旨泡路由事件就不会发生。这是因为这两个事件共享同一个 RoutedEventArgs类的实例
4
一个窗口的事件触发顺序
1深层的嵌套元素先被初始化
2每个元素都完成初始化之后,还需要在它们的容器中进行布局、应用样式,如果需要
的话还会进行数据绑定。
3最外层元素(窗口)触发Load事件,然后嵌套深层元素触发Load事件
内层元素初始化–》
外层元素初始化–》
外层元素Load----》
内层元素Load----》