事件路由
对逻辑树和可视树有所了解很有必要,因为路由事件主要是根据可视树进行路由。路由事件支持三种路由策略:气泡、隧道和直接。
气
泡事件:其操作的名称(例如,MouseDown)。
隧道事件:带有前缀 Preview(例如 PreviewMouseDown)。
直接事件:类似 .NET Framework 中的正常事件。该事件唯一可能的处理程序是与其挂接的委托。
通
常,如果为特殊事件定义了隧道事件,就会有相应的气泡事件。在这种情况下,隧道事件先触发,从根元素开始,下行至源元素,查找处理程序。一旦它被处理或到
达源元素,即会触发气泡事件,从源元素上行,查找处理程序。气泡或隧道事件不会仅因调用事件处理程序而停止路由。如果您想中止隧道或气泡进程,可使用您传
递的事件参数在事件处理程序中将事件标记为已处理。
private void OnChildElementMouseDown(object sender,
MouseButtonEventArgs e) {
e.Handled = true;
}
一
旦您的处理程序将事件标记为已处理,该事件便不会传给任何其他处理程序。这一论断只是部分正确。实际上,事件路由仍在继续起作用,您可利用
UIElement.AddHandler
的替换方法在代码中显式挂接事件处理程序,该方法有一个额外的标记,可以有效指出“即使事件被标记为已处理也可调用我”。您用类似如下所示的调用指定该标
记:
m_SomeChildElement.AddHandler(UIElement.MouseDownEvent,
(RoutedEventHandler)OnMouseDownCallMeAlways,true);
AddHandler 的第一个参数是您想要处理的
RoutedEvent。第二个参数是对事件处理方法(它需要有事件委托的正确签名)的委托。第三个参数指明如果另一个处理程序已将事件标记为已处理,您
是否想得到通知。您调用 AddHandler 的元素就是在路由期间观察事件流动的元素。
路由事件和组合
现在我们来看一看 Button.Click 事件的形成过程,以了解为什么它如此重要。如前所述,用户将对 Button 可视树中的某些子元素(例如上一示例中的 Image)使用 MouseLeftButtonDown 事件启动 Click 事件。
在 Image 元素内发生
MouseLeftButtonDown 事件时,PreviewMouseLeftButtonDown 在根元素启动,然后沿隧道下行至
Image。如果没有处理程序为 Preview 事件将 Handled 标记设置为 True,MouseLeftButtonDown 即会从
Image 元素开始向上传播,直至到达 Button。按钮处理这一事件,将 Handled 标记设为 True,然后引发其自身的 Click
事件。本文中的示例代码包括一个应用程序,它带有整个路由链挂接的处理程序,可帮您查看这一进程。
其 蕴含的意义不可小视。例如,如果我选择通过应用包含
Ellipse 元素的控件模板替换默认按钮外观,可以保证在 Ellipse 外部单击即可触发 Click 事件。靠近 Ellipse
的外缘单击仍处于 my button 的矩形边界内,但 Ellipse 有其自身的 MouseLeftButtonDown 击中检测,而
Ellipse 外部按钮的空白区域则没有。
因 此,只有在 Ellipse 内部的单击才会引发
MouseLeftButtonDown 事件。它仍由附加此模板的 Button
类进行处理,所以,即便是自定义的按钮,您也能得到预测的行为。在编写自己自定义的复合控件时也需牢记这一非常重要的概念,因为您的操作很可能类似
Button 对控件内子元素的事件处理。
分享到:
相关推荐
wpf 揭秘 一共两部分,请下载: wpf 揭秘 wpf揭秘——part1.rar wpf 揭秘 wpf揭秘——part2.rar 然后解压。
5个关于wpf事件路由的例子
wpf 揭秘 一共两部分,请下载: wpf 揭秘 wpf揭秘——part1.rar wpf 揭秘 wpf揭秘——part2.rar 然后解压。
一个wpf路由事件的简单示例,简单模拟牧场农场跳转。
WPF动画——公交车刷卡信号,可以设置成一闪一闪的,可以改颜色,
C# WPF 开发 小鸡快跑 环境vs2008 操作 左右移动 上是跳跃 空格加速
1.WPF路由事件介绍和使用 2.自定义路由事件
wpf编程基础教程,内容覆盖了所有基本知识,是初学者应该看的书。
WPF编程宝典——使用C# 2012和.NET 4.5(第4版)源码,内含32个程序源码文件。
WPF 路由事件介绍,只是为了理解。https://mp.csdn.net/postedit/87923925
Windows Presentation Foundation (WPF) 提供了一组服务,这些服务可用于扩展公共语言运行时 (CLR) 属性的功能。这些服务通常统称为 WPF 属性系统。由 WPF 属性系统支持的属性称为依赖项属性。本概述介绍 WPF 属性...
WPF中实现两种路由事件的具体代码以及详细注释,包括冒泡路由事件和隧道路由事件。
自定义路由事件 尝试 自定义路由事件 尝试
WPF编程宝典——C#2010版(完整版) WPF编程宝典——C#2010版.z01
WPF编程学习——布局 1.布局简介 2.面板(Panel) 3.视图框(Viewbox) 4.滚动视图控件(ScrollViewer) 5.公共布局属性
WPF编程宝典——C#+2010版 书籍配套源码
学习WPF目录树很好的例子,对初学都很有帮助
《WPF编程宝典——C# 2010版》的源代码,配合提供的电子书一起学习。