深入浅出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 控件传递 ...
随机推荐
- C# 高级进阶(一)
产品是怎样开发出来的 首先了解--产品MVP(Minimum Viable Product)的概念 最小可行产品--意思即开发最初应该是根据参品预期,最快构建出一个符合预期可行的功能合集,后期再通过用 ...
- SpringBoot整合Quartz定时任务(持久化到数据库)
背景 最近在做项目,项目中有个需求:需要使用定时任务,这个定时任务需要即时生效.查看Quartz官网之后发现:Quartz提供两种基本作业存储类型: RAMJobStore :RAM也就是内存,默认情 ...
- linux(5)----------防火墙的配置
1.安装: yum install firewalld 2.启动: service firewalld start 3.检查状态: service firewalld sta ...
- 使用volatile的条件
使用volatile的值不能依赖于它之前的值: volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果. ...
- 关于int和Integer缓存(一):以及设计构想(享元模式)
关于Integer的值缓存:在介绍Integer的值缓存之前,我们需要了解的是,java中的包装类型,我们都知道java中有包装类型int Integer ...
- Focal Loss(RetinaNet)笔记 一种减小类别不平衡影响的方法
Paper: https://arxiv.org/abs/1708.02002 还参考了:https://www.jianshu.com/p/8e501a159b28 其中p是预测属于某类的概率.
- MySQL锁(表锁,行锁,共享锁,排它锁,间隙锁)使用详解
锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具.在计算机中,是协调多个进程或县城并发访问某一资源的一种机制.在数据库当中,除了传统的计算资源(CPU.RAM.I/O等等)的争用之外,数据也是一 ...
- 二、安装部署指定的docker版本
1.部署指定的docker版本 1.移除源有版本的docker [root@localhost ~]# yum remove docker docker-common docker-selinux d ...
- 在node节点部署kubectl管理k8s集群
感谢!原文链接:https://blog.csdn.net/sinat_35930259/article/details/79994078 kubectl是k8s的客户端程序,也是k8s的命令行工具, ...
- shell循环语句for
1.方式1 for i in {list[0]} {list[1]} .. do 执行命令 done 2.方式2(三要素循环) for (( 初始值; 判断值; 步长; )) do 执行命令 done