直接路由事件与普通的NET事件类似,只传递一层。它来源于一个元素并且不传递给其他元素。
就比如MouseEnter事件,当鼠标一动到某个元素上时直接触发就是一个直接路由事件。
案例:
冒泡事件设计器:
隧道事件设计器:
直接路由事件设计器:
以上是三个事件的样式设计,写完样式设计之后在冒泡事件中选择MouseUp右键点击转到定义,然后在TextBlock中选择MouseUp右键点击转到定义。
交互逻辑设计:
第二个隧道事件也是一样在设计样式中的隧道事件中选择PreviewMouseLeftButtonUp右键点击转到定义,然后在TextBlock中选择PreviewMouseLeftButtonUp右键点击转到定义。
交互逻辑设计:
第三个直接路由事件也是一样在直接路由事件中选择MouseEnter右键点击转到定义,然后在TextBlock中选择MouseEnter右键点击转到定义。
交互逻辑设计:
写完以上设计之后可运行查看效果。
效果图:
冒泡路由事件点击一次弹出是在YesTB_MouseUp中添加了e.Handled=true。
隧道路由事件点击一次弹出是在StackPanel_PreviewMouseLeftButtonUp中加了e.Handled=true。
直接路由事件鼠标移动到上下方有说明添加的e.Handled=true是无效的。
以上三个案例的总结:冒泡路由事件在YesTB上点击首先弹出TextBlock,在弹出StackPanel。隧道事件在YesTB上点击先弹出StackPanel在弹出TextBlock,直接路由事件当鼠标移动到YesTB上先弹出TextBlock移动到Stackpanel上时直接弹出TackPanel。
这点区别,那么我们加入e.Handled=true的时机也要不同。
冒泡路由事件,例子中:e.Handled=true加在YesTB_MouseUp中,加入后,点击 YesTB,将只弹出“TextBlock”。
隧道路由事件,例子中:e.Handled=true加在
StackPanel_PreviewMouseLeftButtonUp中,加入后,点击YesTB,将只弹出
“Stackpanel”。