自己动手写客户端UI库——事件机制(设计思路大放送)
一:怎么绑定事件的问题
|
在Winform中,我们对一个按钮绑定事件的方式如下(这是真正的事件)
|
|
|
|
然而,在WUI库中,为一个按钮绑定事件是这样的,(这不是一个事件,这只是调用了一个方法,给这个方法传递了一个i额委托)
|
|
|
|
问题:
为什么会有这样的差异呢?实在是无奈之举(也希望园友多提意见)
回答:
我们在给一个WUI按钮绑定事件的时候,这个按钮有可能已经呈现在界面上了;也有可能还没有呈现在界面上;
如果还没有呈现在界面上,那也倒简单,我只要在呈现的时候(也就是把html代码append到浏览器之前),顺便用js给他绑定一个click事件就好了。
但如果他已经呈现在界面上了,该怎么办呢?我虽然也可以用JS绑定事件,但我却不知道该什么时候执行这段JS,这一段代码“btn2.Click += btn2_Click;”是我的用户写的,我不知道他们会什么时候用这一段代码。
所以,无奈之下,只能用这种方法“btn.BindClickEvent(OnClick);”来让用户绑定事件,这样我就可以在BindClickEvent方法内执行那一段JS代码了,毕竟BindClickEvent这个方法是我写的,我可以随意的控制他,让他做我想做的事情
|
二:Button的BindClickEvent方法
| 第一: 这个方法接收一个类型为Action<Button,EventArgs>类型的参数,Action其实就是一个委托,如果对这个东西不了解的朋友,可以看看我之前写的一篇文章《30分钟Linq教程》泛型委托那个小节 第二: 我们把这个参数存入了一个私有的List容器中,为什么这么做呢?一个按钮可以绑定多个Click事件,而且还要有先后顺序,所以按顺序存好,后面点击事件触发的时候,就可以直接遍历这个容器,按顺序执行这个容器中的委托就好了 第三: Button实例IsRendered属性标致只着当前控件是否已经渲染在界面上了 第四: 我们每在界面上添加一个Button,就把这个Button的实例存在这个字典中。为以后使用这个按钮(比如说触发他的事件)打下基础 第五: 我们判断是不是第一次对这个Button的实例做Click事件的绑定,如果是,那么就做下面的工作,如果不是,就不必做了;也就是说不管我给这个按钮绑定多少个Click事件,下面的工作也只做一次 第六: 我们让浏览器执行了一段JS脚本,这段Js脚本执行过之后,事件才算绑定成功;这段脚本给Button的Dom元素绑定了一个click事件,这个事件调用了C#中的ButtonClick方法,并给这个方法传递了一个参数,这个参数就是Button的ID |
三:RenderContext的ButtonClick方法
|
第一:
在本系列的第一篇文章中,我们介绍了C#是怎么和JS通讯的,这里就不多做介绍,只说2点:
1、JS要通过window.external调用C#里的方法
2、要把浏览器的ObjectForScripting设置给一个对象,这个对象必须是ComVisible的
第二:
所有的按钮,Dom元素的所有的click事件都会流入这个方法,这个方法是个路由器,把事件路由给用户的委托
第三:
我们根据按钮的ID,从字典(上一个小节有介绍)中拿出了按钮的实例,然后调用了实例方法Click,
|
四:Button类的Click方法
|
|
|
我们在这个方法中,遍历了所有绑定到Button实例上的“事件”,并且执行了这些事件。
遗留问题:这里没有太关注事件的执行顺序,以后会改进
|
|
第一:
假设一个控件还没有渲染到界面上,那么是否允许开发人员对他绑定事件呢?当然是允许的!那么对于这一类使用方式,是在什么时候绑定事件的呢?就是在渲染的时候绑定的!
我们把控件添加到页面之后,马上就执行了这项工作,Button的ToJs方法就是在做这个工作,稍后介绍这个方法
第二:
只有当一个控件渲染到界面上之后,我们才会把它存入静态字典中,就是这行代码:RenderContext.ControlDic.Add(ctl.Id, ctl);
第三:
对于一个容器控件来说,他有一个Children集合,用来存储他自身的子控件,就是这行代码:this.Children.Add(ctl);
|
|
在这个方法中,我们把绑定事件的JS脚本得到,并反馈给调用者,
以后可能还会有其他的脚本,所以智力使用了StringBuilder
|
|
第一:
事件列表中应该存在待移除的事件
第二:
事件列表中就剩这么一个待移除的事件,并且,这个按钮已经渲染在界面上了;就执行js的解绑脚本
第三:
在事件列表中移除这个事件
|
|
第一:
当事件列表中存在事件记录
第二:
这个按钮已经被渲染在页面上,那么就执行JS解绑脚本
第三:
清空事件记录容器
|
自己动手写客户端UI库——事件机制(设计思路大放送)的更多相关文章
- 自己动手写客户端UI库——创建第一个控件
在上一篇文章中我们主要讲了C#如何和JS通信, 这一篇文章中,我们将创建一个最基础的Button控件 WUI库中控件的继承机制 我们先解释最简单的继承机制,以后WUI库的继承机制会比这个复杂的多 ...
- CodeFirst写界面——自己写客户端UI库
何谓CBS程序 CBS程序就是Client+Browser+Service的程序 纯CS程序写界面,有各种难处,那么我就在Client端引入Browser,让Browser渲染基于HTML的UI界面 ...
- swift 动手写网络请求封装(仿照了一个大神的)不用导入第三方
新建一个类Network import UIKit //NSURLSession 的使用过程: // //构造 NSURLRequest //确定 URL //确定 HTTP 方法(GET.POST ...
- 自已实现一个UI库
[2014年写一个UI库时写的几个文章,公布出来] 几年前的一个嵌入式的UI开发,使自己有机会接触到了UI的一些底层知识,尽管之前也开发过非常多Windows下的信息应用系统,也做非常多的界面开发,但 ...
- ApplicationEvent事件机制源码分析
<spring扩展点之三:Spring 的监听事件 ApplicationListener 和 ApplicationEvent 用法,在spring启动后做些事情> <服务网关zu ...
- 移动Web UI库(H5框架)
1.Framework7 Framework7 - is a free and open source mobile HTML framework to develop hybrid mobile a ...
- 移动Web UI库(H5框架)有哪些,看这里就够了
前言 今年上半年,项目组在项目开发的过程中建立了一套风格统一,组件丰富完善,命名统一规范的PC端UI库,适用于做大型站点,该UI库也是应用到了整个平台的项目中,在各个项目组中进行推广.因为项目的保密性 ...
- 用C++写UI库最本质的思想就是不用C++写UI(如何用 C++ 从零编写 GUI?内含多个开源UI作者的回复,非常精彩)
作者:Bingo链接:https://www.zhihu.com/question/24462113/answer/83371803来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...
- 自己动手写CPU之第七阶段(5)——流水线暂停机制的设计与实现
将陆续上传本人写的新书<自己动手写CPU>,今天是第28篇.我尽量每周四篇 China-pub的预售地址例如以下(有文件夹.内容简单介绍.前言): http://product.china ...
随机推荐
- CSS3基础01
一.选择器: 分为关系选择器 ,属性选择器 ,伪类选择器 1.1关系选择器 后代选择器 ul li 选择所有的后代元素 子代选择器 ul > li 选择ul的儿子 紧邻选择器 .b ...
- HTML <!DOCTYPE> Declaration
<!DOCTYPE html><html><head><title>Title of the document</title></he ...
- linux系统各目录存储的文件类型
/etc 存储各种配置文件 /etc/init.d/ 目录下包含许多系统各种服务的启动和停止脚本.具体可见:http://blog.csdn.net/gongweijiao/article/detai ...
- JavaWeb总结--Servlet 工作原理解析
从 Servlet 容器说起 要介绍 Servlet 必须要先把 Servlet 容器说清楚,Servlet 与 Servlet 容器的关系有点像枪和子弹的关系,枪是为子弹而生,而子弹又让枪有了杀伤力 ...
- modelsim基本操作步骤及每步骤问题解决1(后续有改动会更新)
①File ->New =>Project出现工程对话框->1)工程命名,2)安放路径自己设置,3)库默认work.点击OK 然后出现添加文件到工程对话框->可新建文件或直接添 ...
- Blob(二进制)、byte[]、long、date之间的类型转换
String转成byte[]类型存入数据库,数据库字段对应byte[]的类型为Blob类型 String value = this.getParamNotNnll("bgvalue" ...
- (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- 如何在MAC上使用SVN,简单几行命令搞定
如果你要使用SVN管理代码,如果不是迫不得已,还是看看git吧,但是SVN也要知道怎么用,原理是相似的. 首先,要准备的东西:svnX软件 https://pan.baidu.com/s/1mhEay ...
- [刘阳Java]_Java程序员的成长路线_第3讲
按照Java从业人员的职位晋升来说,Java程序成长路线大致如下 Java程序员 JavaEE初级软件工程师 JavaEE中级软件工程师 JavaEE高级软件工程师 Java架构师 按照职业发展方向, ...
- PHP类中私有方法的内部引用
以前习惯了美工和前端开发,现在进阶后端,开始学习PHP,在学习类的时候,碰到了一个私有方法调用的问题. 代码如下: <?php class Person { public function sa ...