转自:http://jimmyloveforever.blog.163.com/blog/static/119775247200951303935836/
1,C#事件机制是基于委托实现的,因此要首先定义一个委托EventHandler:
public delegate void EventHandler(object from , myEventArgs e)
System.EventArgs是包含事件数据的类的基类,在代码中可直接使用EventArgs类。
myEventArgs类派生于EventArgs类,实现自定义事件数据的功能。这里from表示发生事件的对象。
2,定义事件格式为:
2,定义事件格式为:
event 事件的委托名 事件名
如事件TextOut定义:
public event EventHandler TextOut;
3,事件的激活一般写成:
if (TextOut != null)
TextOut(this,new EventArgs());
检查TextOut事件有没有被订阅,如不为null,则表示有用户订阅。订阅事件的是
TestApp类,首先实例化EventSource,然后订阅事件:
evsrc.TextOut += new EventSource.EventHandler(CatchEvent);
也可以取消订阅:
evsrc.TextOut -= new EventSource.EventHandler(CatchEvent);
View Code
using System; using System.Collections.Generic; using System.Linq; using System.Text;// 定义事件包含数据 public class MyEventArgs : EventArgs {private string StrText;public MyEventArgs(string StrText){this.StrText = StrText;}public string GetStrText{get{return StrText;}} } // 发布事件的类 class EventSource {MyEventArgs EvArgs = new MyEventArgs("触发事件");// 定义委托 public delegate void EventHandler(object sender, MyEventArgs e);// 定义事件 public event EventHandler TextOut;// 激活事件的方法 public void TriggerEvent(){if (TextOut == null)TextOut(this, EvArgs);} } // 订阅事件的类 class TestApp {public static void Main(){EventSource evsrc = new EventSource();// 订阅事件 evsrc.TextOut += new EventSource.EventHandler(CatchEvent);// 触发事件 evsrc.TriggerEvent();Console.WriteLine("------");// 取消订阅事件 evsrc.TextOut -= new EventSource.EventHandler(CatchEvent);// 触发事件 evsrc.TriggerEvent();Console.WriteLine("------"); // 事件订阅已取消,什么也不执行 TestApp theApp = new TestApp();evsrc.TextOut += new EventSource.EventHandler(theApp.InstanceCatch);evsrc.TriggerEvent();Console.WriteLine("------");}// 处理事件的静态方法 public static void CatchEvent(object from, MyEventArgs e){Console.WriteLine("CatchEvent:{0}", e.GetStrText);}// 处理事件的方法 public void InstanceCatch(object from, MyEventArgs e){Console.WriteLine("InstanceCatch:{0},e.GetStrText");} }