WPF知识点全攻略10- 路由事件
路由事件是WPF不得不提,不得不会系列又一
先来看一下他的定义:
功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件。
实现定义:路由事件是一个 CLR 事件,可以由 RoutedEvent 类的实例提供支持并由 Windows Presentation Foundation (WPF) 事件系统来处理。
再来看一下MSDN给出的经典例子:
<Border Height="50" Width="300" BorderBrush="Gray" BorderThickness="1">
<StackPanel Background="LightGray" Orientation="Horizontal" Button.Click="CommonClickHandler" >
<Button Name="YesButton" Width="Auto" Click="YesButton_Click" >Yes</Button>
<Button Name="NoButton" Width="Auto" >No</Button>
<Button Name="CancelButton" Width="Auto" >Cancel</Button>
</StackPanel>
</Border>
private void CommonClickHandler(object sender, RoutedEventArgs e)
{
MessageBox.Show("这个是StackPanel上的点击事件");
} private void YesButton_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("这个是YesButton上的点击事件");
}
点击Yes后,效果如下:

事件,从button上响应后,转移到了StackPanel上又响应了一次。
Button-->StackPanel-->Border-->...
这就是事件的路由传播,也是所谓的冒泡路由策略。
还有一种比较常见到的路由策略,就是Preview开头的,比如:PreviewMouseDown,PreviewDragEnter。这些事件为隧道事件,他和冒泡事件(对应的MouseDown,DragEnter等),在路由的传播上不同。

针对PreviewMouseDown 事件和 MouseDown 事件的处理顺序如下所示:
针对根元素处理 PreviewMouseDown(隧道)。
针对中间元素 1 处理 PreviewMouseDown(隧道)。
针对源元素 2 处理 PreviewMouseDown(隧道)。
针对源元素 2 处理 MouseDown(冒泡)。
针对中间元素 1 处理 MouseDown(冒泡)。
针对根元素处理 MouseDown(冒泡)。
在xaml结构上,隧道事件由外到内,冒泡事件由内到外。在定义控件Templete时,需要留意事件的路由,必要时可以使用e.Handled = true;进行路由传播的阻断。
还有一种直接的路由策略,响应在元素本身的调用处理上,类似WinFrom的事件“路由”,但可以由 EventSetter 和 EventTrigger 使用。关于 EventSetter 和 EventTrigger 此处不做重点记录。
还有事件叫附加事件,本人一般在项目中不会使用,故只在此处Mark一下:
参考网址:https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/advanced/attached-events-overview
参考网址:https://www.cnblogs.com/qq247039968/p/4308775.html
WPF知识点全攻略10- 路由事件的更多相关文章
- WPF知识点全攻略00- 目录
知识点目录如下: 1.WPF相对WinFrom的优缺点 2.WPF体系结构 3.XAML 4.XAML页面布局 5.XAML内容控件 6.WPF中的“树” 7.Binding 8.依赖属性 9.附加属 ...
- WPF知识点全攻略02- WPF体系结构
WPF体系结构图: PersentationFramework.dll包含WPF顶层的类型,包括哪些表示窗口.面板以及其他类型控件的类型.他还实现了高层编程抽象,如样式.开发人员直接使用的大部分类都来 ...
- WPF知识点全攻略11- 命令(Command)
先看一下命令的简单使用: <Window.CommandBindings> <CommandBinding Command="ApplicationCommands.Cut ...
- WPF知识点全攻略07- 数据绑定(Binding)
数据绑定是WPF不得不提,不得不会系列之一 数据绑定简言之,就是把数据源的数据绑定到目标对象的属性上.目标对象可以是承自DependencyProperty的任何可访问的属性或控件,目标属性必须为依赖 ...
- WPF知识点全攻略03- XAML
XAML 是一种声明性标记语言,XAML 是一种基于 XML 并对 XML 结构规则进行了扩展. XAML特点: 定义应用程序的界面元素 显示的声明WPF资源(样式.模板.动画等) 可扩展性(自定义U ...
- WPF知识点全攻略09- 附加属性
附加属性也是一种特殊的依赖属性. Canvas中的Canvas.Left,Canvas.Top ,DockPanel中DockPanel.Dock等就是附加属性. 更加.NET类属性的写法经验.这个中 ...
- WPF知识点全攻略08- 依赖属性
依赖属性是WPF不得不提,不得不会系列又一 先来看一下,自定义依赖属性的写法 public static readonly DependencyProperty IconProperty = Depe ...
- WPF知识点全攻略06- WPF逻辑树(Logical Tree)和可视树(Visual Tree)
介绍概念之前,先来分析一段代码: xaml代码如下: <Window x:Class="WpfApp1.MainWindow" xmlns="http://sche ...
- WPF知识点全攻略05- XAML内容控件
此处简单列举出布局控件外,其他常用的控件: Window:WPF窗口 UserControl:用户控件 Page:页 Frame:用来浏览Page页 Border:嵌套控件,提供边框和背景. Butt ...
随机推荐
- Identity Server 4 原理和实战(完结)_Authorization Code Flow 实例
Code在Oauth2.0和OpenId Connect里面分别叫做不同的名字 OAuth只介绍了如何授权.没有介绍如何身份认证. OpenId Connect:既规定了怎么授权,也规定了怎么身份认证 ...
- MR 图像分割 相关论文摘要整理
<多分辨率水平集算法的乳腺MR图像分割> 针对乳腺 MR 图像信息量大.灰度不均匀.边界模糊.难分割的特点, 提出一种多分辨率水平集乳腺 MR图像分割算法. 算法的核心是首先利用小波多尺度 ...
- JAVA实现DIJKSTRA算法
import java.util.Queue; import java.util.LinkedList; public class dijkstra{ public static void main( ...
- SqlServer2012——快照
1.数据库快照 优点: 维护历史数据以生成报表.由于数据库快照可提供数据库的静态视图,因而可以通过快照访问特定时间点的数据. 将查询实施在数据库的快照上,可以释放主体数据库上的资源. 数据库快照的限制 ...
- HTML学习笔记(四)常用标签
1.超链接 <a href="url">Link text</a> eg:<a href="http://www.w3school.com. ...
- PhpStorm之配置数据库连接
打开编辑器,找到编辑器右侧的 Database 点击 Database,点击左上角的 + ,选择Data Source ,再点击需要连接的数据库类型(因为我的数据库是MySQL,所以使用MySQL数据 ...
- html Css PC 移动端 公用部分样式代码整理
css常用公用部分样式代码整理: body, html, div, blockquote, img, label, p, h1, h2, h3, h4, h5, h6, pre, ul, ol, li ...
- fake-useragent
在编写爬虫进行网页数据的时候,大多数情况下,需要在请求是增加请求头 python下非常好用的伪装请求头的库:fake-useragent,具体使用说明如下: 安装fake-useragent库 pip ...
- ctypes to load library in c/c++
cdll.LoadLibrary(...) restype (default is c_int) argtypes (what's the default? c_int?) customized da ...
- 求N之下的所有素数
No.1 f=lambda n: [x for x in range(1,n) if not [y for y in range(2,x) if x%y ==0 ]] No.2 def prime(n ...