深入浅出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#的生产者和消费者 实例
class Program { //写线程将数据写入myData static int myData = 100; //读写次数 const int readWriteCount = 20; //fa ...
- linux 下文件的权限
- css - 全屏
css - 全屏 heml和body元素的宽高 html与body都是块元素,但它俩比较特殊,宽高由如下定义: 1.默认的宽度=浏览器可视区域的宽度(不包含滚动条),可设置大于可视区域的宽度,但不会计 ...
- 修改IDEA默认模板
然后找到你想要修改的模板就可以了
- SpringSecurity入门
基础 spring security的底层就是一个过滤器链 ExceptionTranslationFilter是一个异常过滤器,用来处理认证授权过程中的异常 UseranmePasswordAuth ...
- js与jquery获取input输入框中的值
如何用javascript获取input输入框中的值,js/jq通过name.id.class获取input输入框中的value 先准备一段 HTML 一.jquery获取input文本框中的值 通过 ...
- linux系统下查看svn服务是否启动,重启及设置开机重启
Linux系统中svn服务是否启动,重启及设置开机启动 安装完svn服务器后虽然好用但是因为经常重启Linux服务器,每次重启完就要去手动启动svn服务器,很是麻烦,于是在网上找了一些方法后,自己 ...
- jenkins AWS CodeDeploy不停机部署
此项目的特点是把Jenkins与CodeDeploy相结合做的CICD做的蓝绿发布,CI与CD 是分开的,CI构建完以后以BuildNumber的形式把war包存至AWS的S3桶中.同时在java项目 ...
- MySQL(二)——常用命令
一.MySQL服务器1.介绍安装服务:mysqld -install停止服务:net stop mysql启动服务:net start mysql用户名:root,密码:Password,连接数据库: ...
- docker for zabbix
docker run -d -v /home/zabbix/mysql --name zabbix-db-storage busybox:latest docker run -d --name zab ...