深入浅出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 控件传递 ...
随机推荐
- 【面试题】挑战10个最难回答的Java面试题(附答案)
转自:https://mp.weixin.qq.com/s/Kd-2qkDfaokHU7d2nfsE6w 1.为什么等待和通知是在 Object 类而不是 Thread 中声明的? 一个棘手的 Jav ...
- mfc HackerTools全局钩子
钩子英文名叫Hook,是一种截获windows系统中某应用程序或者所有进程的消息的一种技术. 如在键盘中按下一键,操作系统将收到键按下消息,把消息放入消息队列,然后消息队列对消息进行派发,发给相应的应 ...
- Spring第一课:核心API(三)
以上是Spring的核心部分,其中需要了解的是:BeanFactory.ApplicationContext[FileSystemXmlApplicationContext.ClassPathXmlA ...
- Git (13) -- Git 分支 -- 分支的新建与合并
@ 目录 0.准备工作 1.新建分支 一个简单提交历史: 创建一个新分支指针: iss53 分支随着工作的进展向前推进: 基于 main 分支的紧急问题分支 hotfix branch: main 被 ...
- springboot开启矩阵传参MatrixVariable
/** * 根据 URI 规范 RFC 3986 中 URL 的定义,路径片段中可以可以包含键值对. * 规范中没对对应的术语.一般 "URL 路径参数" 可以被应用,尽管更加 ...
- DDL和客户端ip监控
DDL触发器监控脚本部署步骤 以下操作请使用sys用户: --第一步:创建表(此表主要保存ddl触发器产生的信息),可以根据不同的业务,使用相关的监控用户,在此监控用户为c##upctest 从可维护 ...
- vue 上传头像悬浮显示文字
template部分: 头像外部加一个 div <div class="user-info-head"> </div> css 部分 <style ...
- WPF 过渡效果
http://blog.csdn.net/lhx527099095/article/details/8005095 先上张效果图看看 如果不如您的法眼 可以移步了 或者有更好的效果 可以留言给我 废话 ...
- crontab 语法和最快速的学习
1.Cron 时间表语法 # ┌───────────── 分钟 (0 - 59) # │ ┌───────────── 小时 (0 - 23) # │ │ ┌───────────── 月的某天 ( ...
- python中字典按键、值进行排序
看到排序,就不禁想起python中的sort和sorted sort是列表中的方法,用于对列表进行排序(改变的是原列表,不返回新列表) 用法: list.sort(key=None,reverse=T ...