这篇文章主要介绍了WPF中隧道路由和冒泡路由事件的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。
WPF中使用路由事件升级了传统应用开发中的事件,在WPF中使用路由事件能更好的处理事件相关的逻辑,我们从这篇开始整理事件的用法和什么是直接路由,什么是冒泡路由,以及什么是隧道路由。
事件最基本的用法
在基于事件驱动的开发中,把代码放在响应注册的事件的处理函数内,比如单击事件,MouseDown事件,MouseUp事件等等。每个控件响应自己的注册事件,有很多如果在事件上有相互关联和影响的事件,就要在一个业务逻辑里写比较多的代码。而路由事件主要的优势就是路由事件可以在元素树上进行传递,并且沿着元素树的传播途径被事件处理程序处理。这样我们写代码的过程中时就可以更好的组织代码到合适的位置。
,WPF事件模型和WPF属性模型非常类似,与依赖项属性一样,路由事件由只读的静态字段表示,在静态构造函数中注册,并通过标准的。净事件定义进行封装。这里我们只讲如何更好的使用。原理部分请看源码。比如ButtonBase提供的点击事件。
,& lt; Button 内容=笆录沓绦颉?单击=癇utton_Click"/祝辞
private void Button_Click (object ,发送方,RoutedEventArgs e) ,,,{ ,,,,,//这是点击事件处理程序代码部分。 ,,,}
在注册事件后,在事件处理程序中第一个参数发送方提供引发该事件的对象,第二个参数是EventArgs对象。在WPF中如果事件不需要传递额外的信息,可以使用RoutedEventArgs类,如果需要传递额外的信息,就要是有继承自RoutedEventArgs的对象。比如处理inkcanvas墨迹绘制的。比如处理多点触控的。这些都是变相继承RoutedEventArgs类。里面会包含在这种场景下更加多的信息只
注册事件的几种写法:
1)在XAML代码中& lt; Button x: Name=癊ventMessageButton",内容=笆录沓绦颉?MouseUp=癊ventMessageButton_MouseUp"/比; 2)在cs代码中,EventMessageButton.MouseUp +=, EventMessageButton_MouseUp; 3)在cs代码中,EventMessageButton.MouseUp +=, new MouseButtonEventHandler (EventMessageButton_MouseUp); private void  EventMessageButton_MouseUp (object ,发送方,MouseButtonEventArgs e) {//我是处理程序。 }
,第一种写法:我们使用XAML文件中在按钮元素内使用MouseUp来创建后台事件处理代码,Btn_eventMessge_MouseUp
,第二种写法:我们在后台代码中使用MouseUp +=的方式注册。一种是新MouseButtonEventHandler传入方法名。一种是匿名的直接传入方法名,这三种注册方式达成的效果是一样的。
而这三种实际上使用的是事件封装器。另一种方式是通过使用UIElement.AddHandler来直接连接事件。这里看个人习惯把。但是各种写法主要解决的问题还是解耦,因为这些会关联到后面的命令,动画。模板。触发器.MVVM下的使用,等等。这是个比较长久的问题,所以在这里,能够使用,看得明白,目前这个阶段就可以了。
我们继续往下解。除关联
在注册事件的时候,最好先使用-=来解除关联,避免多次触发不合符预期的监听事件。断开使用-=或者使用UIElement.RemoveHandler来解除关联只,因为事件在多次+=注册事件处理程序是可行的。而事件的多词解除关系不会引发任何问题,因此不要担心+=和-=不匹配的问题。
public 主窗口() ,,,{ ,,,,,InitializeComponent (); ,-=,EventMessageButton.MouseUp EventMessageButton_MouseUp;,,,,,,+=,EventMessageButton.MouseUp EventMessageButton_MouseUp; ,,,}
理解路由事件
我们知道了事件可以在元素上注册事件处理程序,那么我们知道内容控件是可以相互嵌套各种奇奇怪怪的组合以达到自己想要的效果,在这种情况下我们假设一个比较常见的场景。我们有一个标签,标签中包含一个StackPanel面板,面板中包含一幅图片和2个文本。
& lt; Label BorderBrush=癇lack", BorderThickness=?“比; ,,,,,& lt; StackPanel> ,,,,,,,& lt; TextBlock 利润率=?“在 ,,,,,,,,我是图片标题 ,,,,,,,& lt;/TextBlock> ,,,,,,,& lt; Image 源=?. png",拉伸=癗one"/比; ,,,,,,,& lt; TextBlock 利润率=?“在 ,,,,,,,,,我是图片正文 ,,,,,,,& lt;/TextBlock> ,,,,,& lt;/StackPanel> ,& lt;/Label>WPF中隧道路由和冒泡路由事件的示例分析