自定义事件数据类和自定义事件

要在程序中使用自定义事件,必须满足如下3个条件:

  • 包含事件数据的类(即事件参数类),这个类从System.EventArgs类派生。如果事件不产生数据,则用户可以直接使用System.EventArgs类,否则用户必须定义自己的类。例如如下的代码:

 

自定义事件数据类
 
   
public class AlarmEventArgs : EventArgs
{
private readonly bool snoozePressed;
private readonly int nrings;

// 构造函数 //
public AlarmEventArgs( bool snoozePressed, int nrings)
{
this .snoozePressed = snoozePressed;
this .nrings = nrings;
}

// 定义属性,私有字段nrings //
public int Nrings
{
get { return nrings; }
}

// 定义属性,私有字段snoozePressed //
public bool SnoozePressed
{
get { return snoozePressed; }
}
}

 

  • 事件代理。同样,如果事件不产生数据,用户可以直接使用System.EventHandler,否则必须声明自己的代码类型,例如下面的代码。

(注:在.NET框架中,事件代理具有两个参数:事件源(即触发事件的对象)以及事件参数(包含与事件相关的数据)。)

 

 
  
public delegate void AlarmEventHandler(Object sender, AlarmEventArgs e);

 

  •  触发事件的类。在这个类中要包含事件声明以及触发事件的方法,例如下面的代码。

 

触发事件的类
 
   
// 包含事件和触发事件方法的类 //
public class AlarmClock
{

// 声明事件,它所使用的代理类型为AlarmEventHandler //
public event AlarmEventHander Alarm;

// 触发事件的方法 //
protected virtual void OnAlarm(AlarmEventArgs e)
{
if (Alarm != null )
{
// 通过代理调用事件处理方法 //
Alarm( this , e);
}
}

}

 

定义好包含自定义事件的类后,就可以使用了。下面调用一个包含事件处理方法的类。

包含事件处理方法的类/
 
   
public class WakeMeUp
{
// 事件处理方法,在该方法中根据用户的输入来通过事件参数sender
// 设置事件发送者属性 //
public void AlarmRing(Object sender, AlarmEventArgs e)
{
// 访问自定义事件参数类中定义的数据
Console.WriteLine(e.AlarmString + " \n " );

// 通过事件参数sender来访问触发事件的对象 //
((AlarmClock)sender).SnoozePressed = true ;
((AlarmClock)sender).Stop
= true
// ...
}
}

 

然后,可以在主程序中分别创建事件发送者实例和事件接收者实例,再绑定事件处理方法,最后触发事件就可以了。

代码
 
   
static void Main( string [] args)
{
// 创建事件接收者对象实例 //
WakeMeUp w = new WakeMeUp();

// 创建事件发送者对象实例 //
AlarmClock clock = new AlarmClock();

// 把事件处理方法绑定到发送者的事件上 //
clock.Alarm += new AlarmEventHander(w.AlarmRing);
// clock.Alarm += w.AlarmRing; // 这种绑定方法也可以
clock.Start(); // 触发OnAlarm方法
}

 

转载于:https://www.cnblogs.com/qinlixue/archive/2011/01/03/1924837.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值