深入浅出WPF-08.Event( 事件)01
事件(Event)
首先我们来继续说一下UI组件树,因为WPF事件 的路由环境就是组件树。WPF中的树有两种,一种是逻辑树(Logical Tree),一种是可视元素树(Visual Tree)。逻辑树的显著特点就是它完全由布局组件和控件构成,每个结点不是布局控件就是组件。我们把WPF的控件解剖后继续观察,WPF控件本身是由一颗更细微级别的组件组成的树。这些可视化的组件都是派生自Visual类的。WPF的路由事件是沿着可视元素树进行传递的,只有这样,藏在模板里的控件才能够把消息传递出来。前面我们说过,当这棵树上的某个节点激发了某个事件时,可以通过程序选择通过传统的直接事件模式响应这个事件,也可以让这个事件在UI树中沿着一定的方向传递下去,这个过程就是路由的过程。
事件的前身是消息。Windows是消息驱动的操作系统,消息的本质就是一条数据。事件是基于消息的封装。事件的3个关键点:
1)事件拥有者:即消息的发送者。事件的宿主可以在某些条件下激发她拥有的事件,即事件被触发。事件被触发了则消息被发送。
2)事件的响应者:即消息的接收者、处理者、事件接收者使用事件处理器(Event Handler)对事件作出响应。
3)事件的订阅关系:事件的拥有者可以随时激发事件,但事件激发后会不会得到响应要看有没有事件的响应者,或者说要看这个事件是否被关注了。如果对象A关注对象B 的某个事件是否发生,则称A订阅了B的事件。事件实际上是一个使用evnet关键字修饰的委托类型的成员变量,事件处理器则是一个函数。说A订阅了B的事件,本质上就是让B.Event与A.EventHandle关联起来。所谓的事件激发就是B.Evnet被调用,这时,与其关联的A.EvnetHandle就会被调用。

在上面的事件模型中,事件的响应者通过订阅关系直接关联在事件拥有者的事件上,为了与WPF的路由事件模型区分开,我们把这种事件模型成为直接事件模型或者CLR事件模型。因为CLR事件本质上是一个拥有event关键字修饰的委托实例。
在CLR直接事件模型中,事件的拥有者就是消息的发送者sender。实际上,只要支持事件的委托与响应事件的方法在签名上保持一致(即参数列表和返回值一致),则一个事件可以由多个事件处理器响应(多播事件)、一个事件处理器也可以响应多个事件。
不完美之处:事件的响应者和事件的拥有者之间必须建立订阅这个联系。每对消息是 发送-->响应 的关系,必须建立显示的点对点的订阅关系。事件的宿主必须能够直接访问事件的响应者,不然无法直接建立关系。为了解决这个问题,降低事件订阅带来的耦合度和代码量,WPF退出了路由事件机制。
路由事件和直接事件的区别在于,直接事件激发时,发送者直接将消息通过订阅交给事件响应者,事件响应者使用其事件处理器方法对事件的发生作出相应;路由事件的事件拥有者和事件响应者之间没有直接显示的订阅关系,事件的拥有者只负责激发事件,事件将由谁来响应她并不知道。事件响应者安装了事件的侦听器,针对某类事件进行侦听,当有此类事件传递到,此时事件响应者就使用事件处理器来响应事件并决定事件是否继续传递。
深入浅出WPF-08.Event( 事件)01的更多相关文章
- 《深入浅出WPF》笔记——事件篇
如果对事件一点都不了解或者是模棱两可的话,建议先去看张子阳的委托与事件的文章(比较长,或许看完了,也忘记看这一篇了,没事,我会原谅你的)http://www.cnblogs.com/JimmyZhan ...
- [转]深入浅出WPF(7)——数据的绿色通道,Binding
本文转自:http://liutiemeng.blog.51cto.com/120361/95273 小序: 怎么直接从2蹦到7啦?!啊哦,实在是不好意思,最近实在是太忙了,忙的原因也非常简单——自己 ...
- WPF的路由事件、冒泡事件、隧道事件(预览事件)
本文摘要: 1:什么是路由事件: 2:中断事件路由: 3:自定义路由事件: 4:为什么需要自定义路由事件: 5:什么是冒泡事件和预览事件(隧道事件): 1:什么是路由事件 WPF中的事件为路由事件,所 ...
- js event 事件兼容浏览器 ie不需要 event参数 firefox 需要
js event 事件兼容浏览器 ie不需要 event参数 firefox 需要 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 ...
- 深入浅出WPF(1)—转(http://liutiemeng.blog.51cto.com/120361/91631/)
深入浅出WPF(1)——什么是WPF 2008-05-15 19:06:00 小序: Hi,大家好!几乎两个月没有写技术文章了.这两个月,我在学习WPF.回顾一下两个月的学习历程,有两个感觉— ...
- 《深入浅出WPF》 学习笔记
<深入浅出WPF> 序言 1. 什么是WPF 2. 为什么要学习WPF 第一章 XAML概览 1. XAML是什么? 2. XAML有哪些优点 第二章 从零起步认识XAML 1. 新 ...
- 【【分享】深入浅出WPF全系列教程及源码
】
因为原书作者的一再要求,在此声明,本书中的部分内容引用了原书名为<深入浅出WPF>的部分内容,假设博文不能满足你现有的学习须要,能够购买正版图书! 本人10月份提出离职,可是交接非常慢,预 ...
- WPF 冒泡路由事件
在WPF中,例如,可以构建一个包含图形的按钮,创建一个具有文本和图片混合内容的标签,或者为了实现滚动或折叠的显示效果在一个特定的容器中放置内容.甚至可以多此重复嵌套,直到达到您所希望的层次深度. 这种 ...
- CDI(Weld)高级<4> Event(事件) (转)
目录[-] 1. Event payload(事件的有效载入) 2. Event observers(event的观察者) 3. Event producers(event生产者) 4.Annotat ...
- C# event 事件学习
C# event 事件学习 运行环境:Window7 64bit,.NetFramework4.61,C# 6.0: 编者:乌龙哈里 2017-02-26 章节: 简单事件编写 模拟 WPF 控件传递 ...
随机推荐
- 【RPC】远程接口调用实例 的几种方式比较
pring中,用JMS搞RPC时会用到: org.springframework.jms.remoting.JmsInvokerServiceExporter org.springframework. ...
- spring cloud 知识总结
### 单体应用存在的问题 - 随着业务的发展,开发变得越来越复杂.- 修改.新增某个功能,需要对整个系统进行测试.重新部署.- 一个模块出现问题,很可能导致整个系统崩溃.- 多个开发团队同时对数据进 ...
- C++类的构造函数后面加一个冒号的含义
最近在看侯捷老师讲解的C++知识,他讲到在构造函数加一个冒号初始化值的方法,会使代码更大气,在此记录一下使用方法 构造函数冒号后的初始化class complex{public: complex(do ...
- git推送文件到gitee
注册gitee账号 设置姓名.个人空间地址 点击头像旁边的加号,新建仓库 安装git # 设置姓名和邮箱,姓名是注册gitee时设置的姓名,邮箱是注册gitee的邮箱 git config --glo ...
- 快速使用 Docker 上手 Sentry-CLI - 玩转 Source Maps 使用 (create-react-app)
系列 快速使用 Docker 上手 Sentry-CLI - 创建版本 入门 使用 sentry-cli 上传 source maps 时,您需要设置构建系统以创建版本(release)并上传与该版本 ...
- Asp.NetCore ResposeCache 缓存的使用
先小结一下: 缓存策略: [ResponseCache(CacheProfileName ="default30")] 直接使用缓存,30秒过期: [ResponseCache(D ...
- NX二次开发-使用NXOPEN C++向导模板做二次开发
版本 NX9+VS2012 1.怎么往VS软件里添加VC,C#,VB向导模板 先到NX安装目录下UGOPEN文件夹里找到这三个文件夹 拷贝到VS的安装目录下 这里有几个注意事项,VS2017,VS20 ...
- vue七种实现组建通信的方法
目录 组件通信 1.props 父组件--->子组件通信 2.$emit 子组件--->父组件传递 $emit与props结合 兄弟组件传值 3.bus(事件总线) 兄弟组件通信 4.$p ...
- Ubantu启动失败,提示“Started GNOME Display Manager”之后起不来了
我是在搭建DPDK环境时,为了尝试下多网卡多列配置,将虚拟机的网卡类型由e1000改成了vxnet3类型.之后修改了下内存大小和CPU核数.然后启动ubantu虚拟机,结果无法成功启动,显示结果如下: ...
- ajax获取图片
<img id="contents2_img" alt="" src="images/hope.png" style="wi ...