WPF-11 路由事件之一

什么是路由事件?

我们从两个维度来理解路由事件:

功能的角度来看,路由事件是一种事件类型,不仅仅可以在事件源上处理事件响应,还可以在元素树的多个侦听器上处理事件响应(事件侦听器是附加和调用事件处理程序的元素。事件源是最初引发事件的元素或对象)

实现的角度来看,路由事件是使用 CLR 事件“包装器”实现的,由 RoutedEvent 类的实例支持,并由 WPF 事件系统处理。

根据路由事件的定义方式,当事件在源元素上引发时:

  1. 从源元素到根元素(通常是页面或窗口)通过元素树冒泡

  2. 从根元素到源元素通过元素树向下隧道

  3. 不遍历元素树,只出现在源元素上

<Border Height="30" Width="200" BorderBrush="Gray" BorderThickness="1"><StackPanel Background="LightBlue" Orientation="Horizontal" Button.Click="StackPanel_Click"><Button Name="YesButton">YES</Button><Button Name="NoButton">No</Button><Button Name="CancelButton">Cancel</Button></StackPanel>
</Border>

示例中的这三个Button都有自己Click事件,当触发一个button的Click事件时,Button元素的Click事件沿着树传播到根节点,Button和Border没有响应时间处理程序,但是StackPanel会响应。在这个例子中事件传播:Button -> StackPanel -> Border -> 父元素

如何实现路由事件?

我们可以通过WPF框架提供的接口来注册路由事件,由 RoutedEvent 类的实例支持。从注册中获得的 RoutedEvent 实例通常存储为注册它的类的公共静态只读成员。该类称为事件“所有者”类。通常,路由事件是对同名 CLR 事件的“包装器”。CLR 事件包装器包含添加和删除访问器,以便通过特定于语言的事件语法在 XAML 和代码隐藏中附加处理程序。add 和 remove 访问器覆盖其 CLR 实现并调用路由事件 AddHandler 和 RemoveHandler 方法。路由事件机制类似于依赖属性的机制。

以下示例注册 Tap 路由事件,存储返回的 RoutedEvent 实例,并实现 CLR 事件包装器。

// Register a custom routed event using the Bubble routing strategy.
public static readonly RoutedEvent TapEvent = EventManager.RegisterRoutedEvent(name: "Tap",routingStrategy: RoutingStrategy.Bubble,handlerType: typeof(RoutedEventHandler),ownerType: typeof(CustomButton));// Provide CLR accessors for adding and removing an event handler.
public event RoutedEventHandler Tap
{add { AddHandler(TapEvent, value); }remove { RemoveHandler(TapEvent, value); }
}

路由策略

路由事件使用以下三种路由策略之一:

冒泡:最初,事件源上的事件处理程序被调用。路由事件然后路由到连续的父元素,依次调用它们的事件处理程序,直到它到达元素树根。大多数路由事件使用冒泡路由策略。冒泡路由事件通常用于报告来自复合控件或其他 UI 元素的输入或状态更改。

隧道:最初,调用元素树根处的事件处理程序。路由事件然后路由到连续的子元素,依次调用它们的事件处理程序,直到它到达事件源。遵循隧道路由的事件也称为预览事件。WPF 输入事件通常实现为预览和冒泡对。

直接:仅调用事件源上的事件处理程序。这种非路由策略类似于标准 CLR 事件的 Windows 窗体 UI 框架事件。与 CLR 事件不同,直接路由事件支持类处理并且可由 EventSetters 和 EventTriggers 使用。

为什么用路由事件

软件开发人员并需要知道你正在处理的事件是路由事件,路由事件本身具有自己的特性,如果你正在处理元素自身引发的事件,则该行为是不可用的。但是,如果你将事件附加到父元素或者子元素 ,这时路由事件就体现了它自己的特性。

路由事件支持沿事件路由的元素之间的事件信息交换,因为每个侦听器都可以访问相同的事件数据实例。如果一个元素更改了事件数据中的某些内容,则该更改对事件路由中的后续元素可见。 WPF 样式和模板功能(例如 EventSetters 和 EventTriggers)要求引用的事件是路由事件。

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

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

相关文章

个人总结的一个中高级Java开发工程师或架构师需要掌握的一些技能...

近三年&#xff0c;其实都是在做一个项目&#xff0c;项目是一个大型的多节点部署的项目&#xff0c;做了好几个版本&#xff0c;中间用到了很多技术和框架&#xff0c; 也用了一些管理工具和敏捷实践。我这里不是来说项目的&#xff0c;因为最近看了一些招聘信息&#xff0c;结…

Android 进程常驻(5)----开机广播的简单守护以及总结

这是一个轻量级的库&#xff0c;配置几行代码。就能够实如今android上实现进程常驻&#xff0c;也就是在系统强杀下&#xff0c;以及360获取root权限下。clean master获取root权限下都无法杀死进程 支持系统2.3到6.0 支持大部分设备&#xff0c;包含三星。华为。oppo&#xff0…

[k8s]metricbeat的kubernetes模块kube-metric模块

正确姿势启动metricbeat metricbeat.modules: - module: systemmetricsets:- cpu- filesystem- memory- network- processenabled: trueperiod: 10sprocesses: [.*]cpu_ticks: falseoutput.elasticsearch:hosts: ["http://192.168.x.x:9200"]setup.template.name: &q…

如何为 Task 添加超时功能

前言假设有如下代码&#xff0c;功能是首先从缓存获取数据&#xff0c;如果没有命中缓存&#xff0c;则直接从数据库获取&#xff1a;var data await GetFromCache(); if (data is null) {data await GetFromDB(); }对于获取缓存数据&#xff0c;我们需要限制一下GetFromCach…

php 随机指定位数,php生成一个可选位数的随机码

echo coding(6);function coding($num){$str_arr array(‘a‘,‘b‘,‘c‘,‘d‘,‘e‘,‘f‘,‘g‘,‘h‘,‘i‘,‘j‘,‘k‘,‘l‘,‘m‘,‘n‘,‘o‘,‘p‘,‘q‘,‘r‘,‘s‘,‘t‘,‘u‘,‘v‘,‘w‘,‘x‘,‘y‘,‘z‘,‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘,‘G‘,‘H‘…

Animate与transform的使用

Animate是用css给前端加载动画的效果&#xff1a; 网址&#xff1a;https://daneden.github.io/animate.css/ <!DOCTYPE html> <html lang"en"> <head><link rel"stylesheet" href"static/css/Animate.css"><meta ch…

angular中的cookies与cookieStore区别

设置cookie用put()方法: $cookies.put(key, value[, options]); $cookieStore.put(key, value); 例如设置一个cookie&#xff0c;名为“userName”&#xff0c;值为“yangmin”&#xff1a; //使用$cookies设置cookie $cookies.put(userName, yangmin); //使用$cookieStore设置…

ASP.NET Core 6框架揭秘实例演示[29]:搭建文件服务器

通过HTTP请求获取的Web资源很多都来源于存储在服务器磁盘上的静态文件。对于ASP.NET应用来说&#xff0c;如果将静态文件存储到约定的目录下&#xff0c;绝大部分文件类型都是可以通过Web的形式对外发布的。“Microsoft.AspNetCore.StaticFiles” 这个NuGet包中提供了三个用来处…

js 栈(进制转换)

<!DOCTYPE html>Documentposted 2017-12-07 19:33 mysure 阅读(...) 评论(...) 编辑 收藏 刷新评论刷新页面返回顶部转载于:https://www.cnblogs.com/ar13/p/8000718.html

流程展示 php,js实现动态的流程进度展示条

这次给大家带来js实现动态的流程进度展示条&#xff0c;js实现动态流程进度展示条的注意事项有哪些&#xff0c;下面就是实战案例&#xff0c;一起来看一下。一、设计思路分为以下几步(仅供参考)【竖线线】这个采用ul的list标签制作&#xff0c;保证了可随时添加&#xff0c;以…

【我们一起写框架】C#的AOP框架

原文:【我们一起写框架】C#的AOP框架前言 AOP&#xff0c;大家都是听过的&#xff0c;它是一种面向切面的设计模式。 不过AOP虽然是被称为设计模式&#xff0c;但我们应该很少能看到AOP设计的框架。为什么呢&#xff1f; 因为&#xff0c;AOP单独设计的框架几乎是无法使用的。普…

新浪微博授权认证过程

为什么80%的码农都做不了架构师&#xff1f;>>> 一、授权认证 1、请求用户授权Token URL&#xff1a; https://api.weibo.com/oauth2/authorize HTTP请求方式:GET/POST 请求参数 必选 类型及范围 说明 client_id true string 申请应用时分配的AppKey。 redire…

VisualStudio 使用 FastTunnel 辅助搭建远程调试环境

有时候需要远程调试一些用户问题&#xff0c;期望能使用本机的 Visual Studio 开发环境&#xff0c;调试远程的用户的设备上的应用。这时会遇到的一个问题是如何让本机的 Visual Studio 可以连接上远程的用户的设备&#xff0c;从而进行调试。本文将告诉大家如何采用 FastTunne…

深入理解null的原理

--null的原理 --oracle一直将null和空字符串’’<长度为0>同等对待<如’’ is null是true,’’null为false,如果声明a varchar2:’’,那么a is null为true,a’’为false>--1.null的运算 --算术表达式和null 运算总为null,实际上所有的操作符除了||连接操作符外&…

阻止中文输入法输入拼音的时候触发input事件

阻止中文输入法输入拼音的时候触发input事件 前言 最近看element-ui源码的时候看到el-input发现的。这个少见的事件。 compositionstart、compositionend事件&#xff08;MDN解释) compositionstart事件触发于一段文字的输入之前&#xff08;类似于 keydown 事件&#xff0c;但…

Python1

python介绍python是一种解释型的&#xff0c;面对对象的。带有动态语义的高级程序设计语言python简史1989年,Guido(龟叔)为ABC 语言写的一个插件。因Monty Python的喜剧团体的原因,故给这个语言起名为python。linux也是1989年诞生的,1991年正式发布linux1.0内核;1990年, 发布py…

ncut算法matlab实现,ncut_multiscale_1_6 经典的图像分割算法 的Matlab代码。 238万源代码下载- www.pudn.com...

文件名称: ncut_multiscale_1_6下载收藏√ [5 4 3 2 1 ]开发工具: matlab文件大小: 587 KB上传时间: 2015-04-17下载次数: 4提 供 者: HH详细说明&#xff1a;经典的图像分割算法NCut的Matlab代码。-Matlab code of classic image segmentation algorithm NCut .文件列表(…

使用.NET从零实现基于用户角色的访问权限控制

使用.NET从零实现基于用户角色的访问权限控制本文将介绍如何实现一个基于.NET RBAC 权限管理系统&#xff0c;如果您不想了解原理&#xff0c;可查看推送的另一篇文章关于Sang.AspNetCore.RoleBasedAuthorization[1] 库是使用介绍&#xff0c;直接使用该库即可。背景在设计系统…

数据归一化

数据归一化 数据的标准化是将数据按比例缩放&#xff0c;使之落入一个小的特定区间&#xff0c;一般为0到1之间。在某些比较和评价的指标处理中经常会用到&#xff0c;去除数据的单位限制&#xff0c;将其转化为无量纲的纯数值&#xff0c;便于不同单位或量级的指标能够进行比较…

vi is failed with error E382: Cannot write, 'buftype' option is set in Linux

在linux下生成jar文件遇到了编码问题&#xff0c;于是想vi t.jar&#xff0c;在保存是报错&#xff1a;E382: Cannot write, buftype option is set 解决方法&#xff1a; 可以用下面的命名查看buftype的设置&#xff0c;当buftypenofile时&#xff0c;不能保存文件&#xff0c…