您的位置:首页 > 编程语言 > C#

.NET 中自定义事件的驱动(C#)

2010-11-03 15:18 309 查看
在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;
}
}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wonsoft/archive/2008/10/28/3169107.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: