委托和事件的一点思考
思考:事件是如何触发的?
1.定义事件
2.订阅方法,方法入链的过程。
3. 传入参数到事件调用事件执行,此处触发事件。
以Button的Click事件为例,下面两句话很常见,一个是事件的订阅过程,一个是实现事件订阅的方法;
button1.Click+=new System.EventHandler(button1_Click);
private void button1_Click(object sender, EventArgs e){}
但是事件的触发Click(obj,e)很难能找到。其实这个有操作系统管理了,操作系统后台管理着一个循环,响应鼠标单击这样的消息,此时触发事件。
在《C#高级编程》一书第7章180页左右介绍了一个自定义事件的过程(不作引用了!)
事件即委托,事件就是一种委托,一种规范化的委托。事件不仅仅是用户的单击鼠标、键盘等等这样的物理事件。对象可以定义事件,事件的精髓在于产生一个事件,触发一个或者多个方法按照订阅的顺序执行。
ArcGIS的编辑功能就是事件应用的最好范例:
简单的编辑大概可以分为这样几个流程,下面的实在是太简化了不是实际情况,详细可以查看IEngineEditor接口定义的事件,AE提供了事件监听的例程:
1.开始编辑(设置当前工作空间、当前任务、当前图层)
2.添加、删除、修改要素(鼠标屏幕交互,更新到内存,重新绘屏,关联的属性窗体更新)
3.保存编辑
这样定义一系列事件,可以将一个复杂的工作流分解,同时为事件订阅新的方法又可以增加一些新的内容。这里通过寻找事件的触发过程,可以理解程序执行的脉络,毕竟程序是一句一句执行的。
思考窗体的关闭过程:
Form_Closing,对于希望增加新的订阅方法来说这只可能是程序执行中的一个时间点,之前微软一定是否已经定义了一个订阅的方法,这倒未必。我们任然可以通过订阅新方法执行一系列操作,这样就实现了扩展。这个事件由谁来触发,什么时候触发?
Form_Closed,关闭的过程很复杂,要释放资源。这个事件由谁来触发,什么时候触发?
Text_changed事件、SelectIndexChanged事件呢?这些无疑都是由应用程序或者说是操作系统触发的。但是什么时候触发这个就有的复杂了。
仔细想一想TextChang的过程大概也能够明白,首先是TextBox获得焦点,键盘输入,失去焦点。