.NET 中自定义事件的驱动(C#)
(Wonsoft)
在Windows应用的开发过程中,常常会借助Windows的事件驱动机制,自己定义事件,使应用程序的具有更好的封装。特别是在基于组件的应用开发中,更能体现其优越性。当然在MFC中自定义事件是很容易的一件事,但在C#中有其特有的定义模式。
首先定义事件是很容易的一件事,但光定义了事件,而不驱动这个事件,那么事件的定义就毫无意义。文章通过几个实例来描述C#中自定义事件及其驱动机制。
事件的驱动方式不同有几种:1、成员中直接驱动;2、属性变动时驱动。下面举例分别说明它们的使用方法。
实例1 :成员中直接驱动(参考1)
- // Step-1: 首先定义一个新的 EventArgs ,其中包括一个属性,用于传送超过100的结果值
- // 要注意的是:该类要继承自系统的 EventArgs 类。需要多个属性时定义方法与 HighValue 类似。
- class LevelHighArgs : EventArgs
- {
- int _highValue = 0;
- public int HighValue
- {
- get { return _highValue; }
- set { _highValue = value; }
- }
- public LevelHighArgs(int _highValue)
- {
- this._highValue = _highValue;
- }
- }
- // Step-2: 处理类。在该类中定义委托,和事件处理方法。
- class AddTowInt
- {
- // 委托定义
- public delegate void LevelHigh(object sender, LevelHighArgs e);
- // 委托类型的事件处理方法
- public event LevelHigh OnLevelHigh;
- int _addedValue = 0;
- public int AddedValue
- {
- get { return _addedValue; }
- set { _addedValue = value; }
- }
- public AddTowInt()
- { }
- public void DoAdd(int a1, int a2)
- {
- _addedValue = a1 + a2;
- if (_addedValue > 100)
- {
- LevelHighArgs lha = new LevelHighArgs(_addedValue - 100);
- // 在结果 > 100 时,抛出事件
- OnLevelHigh(this, lha);
- }
- }
- }
- // 使用及事件的捕捉
- class Program
- {
- static void Main(string[] args)
- {
- // 计算程序对象
- AddTowInt ati = new AddTowInt();
- // 注册事件处理程序
- ati.OnLevelHigh += new AddTowInt.LevelHigh(ati_OnLevelHigh);
- // 传送测试数据。此时结果为 101 会触发事件,可换成 23, 77 调用会看到事件没有触发。
- ati.DoAdd(23, 78); // 显示调用
- Console.WriteLine(ati.AddedValue);
- Console.ReadLine();
- }
- static void ati_OnLevelHigh(object sender, LevelHighArgs e)
- {
- // 此处 e 中可以看到有一个 HighValue 属性,该值就是我们定义在 LevelHighArgs 中的属性
- Console.WriteLine("结果已经超过 100: " + e.HighValue);
- }
- }
实例2: 成员中直接驱动(参考2)
- //文件名:ChatServer.cs
- public class ChatServer
- {
- public delegate void MyEventHandler(string msg);
- public event MyEventHandler onSendMsg;
- public void SendMsg()
- {
- onSendMsg("开始发送消息!");
- }
- }
- // 文件名:Form1.cs
- ///
- //类事件的处理代码如下
- private void SendMsgTest()
- {
- //创建ChatServer类的实例
- ChatServer f_Server;
- f_Server = new Server();
- f_Server.onSendMsg += new Server.MyEventHandler(this.OnSendMsg);
- //调用 f_Server的SendMsg()函数
- f_Server.SendMsg();
- }
- //处理 onSendMsg 事件代码
- protected void OnSendMsg(string msg)
- {
- //输出调试信息
- Console.WriteLine(msg);
- }
实例3:属性变动时驱动(参考3)
- namespace Test
- {
- class Program
- {
- static void Main(string[] args)
- {
- MonitoringNameChangement M = new MonitoringNameChangement();
- M.NameChanged += new NameChanged(M_NameChanged);
- while (true)
- {
- Console.WriteLine("请输入一个新的名字,您将会看到您自定义的事件会被执行");
- M.ChangeName = Console.ReadLine();
- }
- }
- static void M_NameChanged(string oldName, string NewName)
- {
- Console.WriteLine("******************************************* 名字已经改变");
- Console.WriteLine("新名字是: {0} 老名字是: {1}", NewName, oldName);
- Console.WriteLine("******************************************* ");
- }
- }
- //定义一个监控名字变化的委托
- public delegate void NameChanged(string oldName, string NewName);
- //定义一个名字监控类
- public class MonitoringNameChangement
- {
- private string name = "老名字";
- public string ChangeName{
- set
- {
- //如果输入的是全新的名字,则会调用监控名字的事件,并且存储新名字
- if (name != value)
- {
- NameChanged(name, value);
- name = value;
- }
- }
- get
- {
- return name;
- }
- }
- //监控名字的事件
- public event NameChanged NameChanged;
- }
- }