WPF知识点全攻略10- 路由事件

摘要:
WPF必须提到路由事件。让我们先看看它的定义:函数定义:路由事件是一个可以为元素树中的多个侦听器调用处理程序的事件。这些事件是隧道事件。它们在路由传播方面不同于气泡事件。在xaml结构中,隧道事件从外到内,气泡事件从内到外。在定义控件Templet时,需要注意事件路由。如果需要,可以使用eHandled=true;阻止路由传播。还有一种直接路由策略,它响应元素本身的调用处理,类似于WinFrom事件“路由”,但可以由EventSetters和EventTriggers使用。

路由事件是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后,效果如下:

WPF知识点全攻略10- 路由事件第1张

事件,从button上响应后,转移到了StackPanel上又响应了一次。

Button-->StackPanel-->Border-->...

这就是事件的路由传播,也是所谓的冒泡路由策略。

 还有一种比较常见到的路由策略,就是Preview开头的,比如:PreviewMouseDown,PreviewDragEnter。这些事件为隧道事件,他和冒泡事件(对应的MouseDown,DragEnter等),在路由的传播上不同。

WPF知识点全攻略10- 路由事件第2张

针对PreviewMouseDown 事件和 MouseDown 事件的处理顺序如下所示:

  1. 针对根元素处理 PreviewMouseDown(隧道)。

  2. 针对中间元素 1 处理 PreviewMouseDown(隧道)。

  3. 针对源元素 2 处理 PreviewMouseDown(隧道)。

  4. 针对源元素 2 处理 MouseDown(冒泡)。

  5. 针对中间元素 1 处理 MouseDown(冒泡)。

  6. 针对根元素处理 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- 路由事件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇每一个C#开发者必须知道的13件事情python基础语法_2基本数据类型下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【WPF学习】第五十二章 动画性能

  通常,为用户界面应用动画只不过是创建并配置正确的动画和故事板对象。但在其他情况下,特别是同时发生多个动画时,可能需要更加关注性能。特定的效果更可能导致这些问题——例如,那些涉及视频、大位图以及多层透明等的效果通常需要占用更多CPU开销。如果不谨慎实现这类效果,运行它们使可能造成明显抖动,或者会从其他同时运行的应用程序抢占CPU时间。   幸运的是,WP...

EIGRP 超强总结

1)EIGRP的特征和属性:EIGRP是一个高级的距离矢量协议,因为它的快速收敛和保证无环。有以下特征:1、组播和单播:EIGRP组播地址是224.0.0.10 ,使用组播和单薄取代广播2、支持多种网络层协议3、100%无环路:采用DUAL算法4、快速收敛:一个运行EIGRP的路由器保存所有邻居的路由表信息,以至于它能快速适应可替代的路由。如果没有合适的路...

Linux下的静态路由配置

在日常运维作业中,经常会碰到路由表的操作。下面就linux运维中的路由操作做一梳理:------------------------------------------------------------------------------先说一些关于路由的基础知识:1)路由概念路由:   跨越从源主机到目标主机的一个互联网络来转发数据包的过程路由器:能够...

WPF 2D绘图(3)PathGeometry

PathGeometry可以创建任意的2D图形形状。 其内部通过PathSegment集合来实现 如画2个三角形 <Path Stroke="Black" StrokeThickness="1"> <Path.Data> <PathGeometry>...

顺丰丰桥软件开发工具包 (.NET)

丰桥 - 一站式对接服务平台, 打通客户与顺丰系统之间的信息流, 实现物流供应链一体化. 随着一个电商项目和顺丰合作, 信息流对接就是我们开发的事了. 顺丰通过丰桥提供了一些开放接口, 不过丰桥提供的 SDK 非常简陋, 对 .NET 的支持就更差了. 于是就有了这个项目 sf-express-sdk-net 主要接口集成: 接口 接口方式 描述...

React native路由跳转navigate、push、replace的区别

由于没有系统的去学习RN,对路由跳转了解不多,只是跟着项目在做,抽点时间简单学习一下RN路由跳转方法区别,总结如下: 如上图,外部是一个栈容器,此时A页面在最底部,navigate到B页面,为什么此时用navigate没有用push呢,因为在栈内没有B页面时,用navigate和push是一样的,都是进行入栈操作,没有区别,出于习惯使用navigate。...