要在程序中使用自定义事件,必须满足如下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; }
}
}
{
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 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
// ...
}
}
{
// 事件处理方法,在该方法中根据用户的输入来通过事件参数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方法
}
{
// 创建事件接收者对象实例 //
WakeMeUp w = new WakeMeUp();
// 创建事件发送者对象实例 //
AlarmClock clock = new AlarmClock();
// 把事件处理方法绑定到发送者的事件上 //
clock.Alarm += new AlarmEventHander(w.AlarmRing);
// clock.Alarm += w.AlarmRing; // 这种绑定方法也可以
clock.Start(); // 触发OnAlarm方法
}