WPF-12 路由事件之二

WPF 为我们提供了许多不同的事件处理机制——它们是冒泡、隧道和直接的。这些都称为路由事件

直接事件

直接在事件源上处理,这个有点像WinForms中的按钮OnClick事件,直接在事件处理程序中处理业务

冒泡事件

当事件没有被元素(比如一个文本框)处理并且事件“冒泡”到持有它的 UI 容器时,就会发生冒泡

例如,假设你有一个包含StackPanel的窗口,在该面板内你有一个Grid,在该Grid内您有一个文本框。如果文本框未处理事件,则它会冒泡到Grid级别,如果未在该级别处理,则事件会进一步冒泡(称为可视化树)到可能会或可能不会被处理的面板。这个过程一直持续到它被处理或事件脱离了最顶层的元素

隧道事件

隧道与冒泡相反,事件不是沿着可视树向上传播,而是沿着可视树向下传播到源元素。隧道事件都以Preview开头,例如 PreviewDownKey和PreviewMouseButtonDown。可以在它们到达目标元素的途中捕获它们并进行处理

事件对

大多数冒泡事件都与隧道事件配对。例如,PreviewKeyDown(隧道)键事件与Keydown 事件(冒泡)配对。当隧道事件沿着视觉树向下工作并命中它起源的元素(比如一个按钮)时,如果它没有处理,那么该按钮将启动一个“Keydown”冒泡事件,该事件会在视觉树上冒泡直到它自己被处理

处理事件

每种类型的事件处理程序都传递一个RoutedEventArgs对象。该对象有三个常用属性,Handled属性和Source属性以及OriginalSource属性。将Handled设置为 true,并且任何沿可视化树的事件处理程序将不再处理该事件

前面我们的示例描述了一个指向文本框的隧道KeyDown事件。如果包含UI元素(窗口、面板或表格)捕获并处理隧道事件(通过将 Handled 属性设置为 true),则文本框将不会接收该事件,并且不会触发任何匹配的冒泡事件

<Window x:Class="Example_11.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:Example_11"mc:Ignorable="d" Title="MainWindow" Height="450" Width="800" Keyboard.PreviewKeyDown="Window_PreviewKeyDown"Keyboard.KeyDown="Window_KeyDown"><StackPanel Height="300" Width="400" Keyboard.PreviewKeyDown="StackPanel_PreviewKeyDown"Keyboard.KeyDown="StackPanel_KeyDown"><Grid Height="250" Width="300"Keyboard.PreviewKeyDown="Grid_PreviewKeyDown"Keyboard.KeyDown="Grid_KeyDown"><Grid.RowDefinitions><RowDefinition></RowDefinition><RowDefinition></RowDefinition></Grid.RowDefinitions><TextBox Grid.Row="0" Width="200" Height="30"></TextBox><Button Grid.Row="1" Width="200" Height="50">Button</Button></Grid></StackPanel>
</Window>
using System.Windows;
using System.Windows.Input;
namespace Example_11
{/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}private void Window_PreviewKeyDown(object sender, KeyEventArgs e){MessageBox.Show("Window_PreviewKeyDown");//e.Handled = true;}private void StackPanel_PreviewKeyDown(object sender, KeyEventArgs e){MessageBox.Show("StackPanel_PreviewKeyDown");//e.Handled = true;}private void Grid_PreviewKeyDown(object sender, KeyEventArgs e){MessageBox.Show("Grid_PreviewKeyDown");//e.Handled = true;}private void Grid_KeyDown(object sender, KeyEventArgs e){MessageBox.Show("Grid_KeyDown");//e.Handled = true;}private void Window_KeyDown(object sender, KeyEventArgs e){MessageBox.Show("Window_KeyDown");//e.Handled = true;}private void StackPanel_KeyDown(object sender, KeyEventArgs e){MessageBox.Show("StackPanel_KeyDown");//e.Handled = true;}}
}

当我们向TextBox输入值时,会看到事件的执行顺序为:

  1. Window_PreviewKeyDown

  2. StackPanel_PreviewKeyDown

  3. Grid_PreviewKeyDown

  4. Grid_KeyDown

  5. StackPanel_KeyDown 

  6. Window_KeyDown

    在本文中,我们看到 WPF 中的用户界面事件可以是隧道、冒泡或直接事件。针对隧道和冒泡事件,我们可以捕捉、处理事件或让事件继续执行。我们可以通过捕获隧道事件并将 Handled 属性设置为 true 来阻止息到达控件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281609.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对01背包的分析与理解(图文)

首先谢谢Christal_R的文章(点击转到链接)让我学会01背包 本文较长&#xff0c;但是长也意味着比较详细&#xff0c;希望您可以耐心读完。 题目: 现在有一个背包(容器),它的体积(容量)为V,现在有N种物品(每个物品只有一个),每个物品的价值W[i]和占用空间C[i]都会由输入给出,现在…

linux内核源码剖析 博客,【Linux内存源码分析】页面迁移

页面迁移其实是伙伴管理算法中的一部分&#xff0c;鉴于其特殊性&#xff0c;特地另行分析。它是2007年的时候&#xff0c;2.6.24内核版本开发时&#xff0c;新增碎片减少策略(the fragmentation reduction strategy)所引入的。该策略也称之为反碎片技术(anti-gragmentation)。…

360的下一代SOC是这个样子的

几乎所有大型企业或机构的IT系统中&#xff0c;都会有安全运营中心(SOC)&#xff0c;它是网络安全防护体系从设备部署到系统建设&#xff0c;再到统一管理&#xff0c;这一发展过程的自然产物。但在国内的实际应用中&#xff0c;SOC的问题多多。 首先是数据类型不全&#xff0c…

【转载】利用scipy.misc等库对jpg以及png等图像数据预处理(用于深度学习喂数据)...

http://blog.csdn.net/qq_16949707/article/details/56306720 转载于:https://www.cnblogs.com/tenderwx/p/8057599.html

2018年下半年网络公式考试案例分析真题

阅读以下说明&#xff0c;回答问题1至问题3&#xff0c;将解答填入答题纸对应的解答栏内。【说明】某公司网络划分为两个子网&#xff0c;其中设备A是DHCP服务器&#xff0c;如图3-1所示。 【问题1】(6分&#xff0c;每空2分)DHCP在分配IP地址时使用 (1) 的方式&#xff0c; 而…

哪一个不是linux常用的shell,Linux下查看使用的是哪种shell的方法汇总

查看当前发行版可以使用的shell复制代码代码如下:[rootlocalhost ~]$ cat /etc/shells/bin/sh/bin/bash/sbin/nologin查看当前使用的shell方法一、最常用的查看shell的命令&#xff0c;但不能实时反映当前shell复制代码代码如下:[rootlocalhost ~]$ echo $SHELL/bin/bash二、下…

企业建设呼叫中心需要考虑哪些因素

呼叫中心发展至今&#xff0c;它的意义早已不是90年代末,只是简单地解决客户客服系统的要求。现在的呼叫中心有了新的使命&#xff0c;比如拓展成为一个信息服务中心&#xff0c;或者成为一个营销中心。客户如何能通过这样的手段&#xff0c;使企业与其他的企业之间形成差异化的…

【单片机入门】(三)应用层软件开发的单片机学习之路-----UART串口通讯和c#交互...

本文由网友投稿。作者&#xff1a;陈显达原文标题&#xff1a;【单片机入门】(三)应用层软件开发的单片机学习之路-----UART串口通讯和c#交互原文链接&#xff1a;https://www.cnblogs.com/1996-Chinese-Chen/p/16826558.html引言在第一章博客中&#xff0c;我们讲了Arduino对E…

linux中使用yum的优点,linux – 自动“yum update”以保证服务器安全 – 优点和缺点?...

这取决于根据我使用CentOS的经验,它非常安全,因为您只使用CentOS基本存储库.您是否应该偶尔尝试更新失败…是…在您应该期望出现故障的硬盘驱动器或偶尔出现故障的CPU的同一级别上.您永远不会有太多备份. &#x1f642;关于自动更新的好处是,您可以比手动修补更快(因此更安全).…

高能力成熟度软件企业中软件质量工程师的职责

随着科学技术的不断发展进步&#xff0c;企业之间的竞争越来越激烈。软件企业要想在竞争中发展生存&#xff0c;提高软件产品质量已成为必要条件。在一些高能力成熟度软件企业中&#xff0c;专门成立了质量保证和控制职能部门&#xff0c;起着提高项目管理透明性和确保软件产品…

存储过程和函数的区别

存储过程和函数的区别存储过程和函数目的是为了 可重复地 执行操作数据库的sql语句的集合。区别是写法和调用上。写法上&#xff1a;存储过程的参数列表可以有输入参数、输出参数、可输入输出的参数&#xff1b;函数的参数列表只有输入参数&#xff0c;并且有return <返回值…

机器学习案例丨基于广泛和深入的推荐 - 餐厅评级预测

点击上方蓝字关注我们&#xff08;本文阅读时间&#xff1a;18分钟&#xff09;Microsoft Azure Machine Learning Studio 是微软强大的机器学习平台&#xff0c;在设计器中&#xff0c;微软内置了15个场景案例&#xff0c;但网上似乎没有对这15个案例深度刨析的分析资料&#…

css linux 等宽字体,比例字体等宽字体

我们都知道等宽字体和比例字体的区别&#xff0c;就在于比例字体(Monospaced Font)即每个字母宽度是按一定比例自动调整的&#xff0c;而等宽字体(Proportional font)则是固定宽度&#xff0c;固定间距&#xff0c;字体的每一个字母和字符所占的水平空间都是相同的。比例字体&a…

三星智能家居系统频繁故障 大批用户受到影响

Shelley Powers正在她密苏里州郊区的房子中鼾睡&#xff0c;突然警铃大作将她惊醒&#xff0c;在仔细排查之后&#xff0c;发现是虚惊一场&#xff0c;是安全传感器误报。在此之后的几周&#xff0c;她的三星Smart Things智能家居系统频繁出现故障&#xff0c;比如设定的灯具不…

适用于 .NET 的开源文本差异对比组件

你好&#xff0c;这里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;实用的工具或组件&#xff0c;希望对您有用&#xff01;简介对于开发人员来说&#xff0c;Git 是我们经常使用的工具&#xff0c;在每次编写完代码并提交后&#xff0c;我们可以通过 git dif…

MySQL—查询某时间范围的数据

-- 查询今天的数据 select * from user where to_days(birthday) to_days(CURDATE()); -- 查询昨天的数据 select * from user where to_days(CURDATE()) - to_days(birthday)<1; -- 查询最近7天的数据 select * from user where birthday > DATE_SUB(CURDATE(),INTERVA…

box-shadow阴影合集

2019独角兽企业重金招聘Python工程师标准>>> * box-shadow可以设置6个值。其中4个可选&#xff1b;2个必须指定&#xff1a;分别是x轴偏移量和y轴偏移量&#xff0c;这2个值可以是正值&#xff0c;可以是负值&#xff0c;也可以是0&#xff0c;但不可以省略不写 阴影…

《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一一2.5 为跨年度的个人参赛选手构造记录...

本节书摘来自华章计算机《数据科学R语言实践&#xff1a;面向计算推理与问题求解的案例研究法》一书中的第2章&#xff0c;第2.5节,作者&#xff1a;[美] 德博拉诺兰&#xff08;Deborah Nolan&#xff09;  邓肯坦普朗&#xff08;Duncan Temple Lang&#xff09;  更多章…

基于 abp 微服务架构的开源低代码平台

你好&#xff0c;这里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;实用的工具或组件&#xff0c;希望对您有用&#xff01;简介 ABP-MicroService是 一个基于ABP vNext微服务架构、vue-element-admin的后台管理框架&#xff0c;适用于大型分布式业务系统和企…

linux android sdk gengxinman,Android 实现增量更新

一、概述增量更新相较于全量更新的好处不言而喻&#xff0c;利用差分算法获得1.0版本到2.0版本的差分包&#xff0c;这样在安装了1.0的设备上只要下载这个差分包就能够完成由1.0-2.0的更新。比如&#xff1a;存在一个1.0版本的apkapk1.png然后需要升级到2.0版本&#xff0c;而2…