之后开发日志不再按照日期命名

某个功能需求要求插件实现在主程序满足特定条件时触发函数调用,因此需要在框架和接口中添加自定义事件处理,通过事件触发的方式来在主程序中插入插件的功能函数。

# 自定义事件处理 定义

添加定义事件类 EvtHanlder

在插件接口类中添加属性 EvtHanlder: handler

1
public EvtHanlder hanlder{get;}

添加事件处理机制,添加 CustomEvent 枚举类,用来描述主窗体的自定义事件,并将相应设置相应触发器,使得插件可以执行对应的事件 handler。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//事件委托
public delegate void DefaultEventHanlder(object sender, CustomEventArgs Args);
public delegate void ReelChangeHandler(object sender, CustomEventArgs Args);
public delegate void ...;

//事件枚举类型
public enum CustomEvent
{
//默认事件
DefaultEvent,
//换卷事件
ReelChangeEvent,
...

}

在 EvtHandler 类中 定义事件

1
2
3
4
//定义事件
public event DefaultEventHanlder DefaultEvent;
public event ReelChangeHandler ReelChangeEvent;
public event ...;

添加事件触发器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//事件触发
public void Trigger(object sender, CustomEventArgs Args)
{
CustomEvent e = Args.e;
//分类事件处理
switch (e)
{
case CustomEvent.ReelChangeEvent:
ReelChangeEvent(sender, Args);
break;
case ...:
...;
break;
default:
DefaultEvent(sender, Args);
break;
}
}

在构造函数中添加默认处理函数

1
2
3
4
5
6
public EvtHanlder()
{
DefaultEvent += new DefaultEventHanlder((object sender, CustomEventArgs Args) => { });
ReelChangeEvent += new ReelChangeHandler((object sender, CustomEventArgs Args) => { });
...;
}

# 自定义事件处理 使用

在插件中 Plugin.cs 实现 EvtHandler handler 接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//定义事件和处理函数
public EvtHanlder hanlder
{
get {
EvtHanlder h = new EvtHanlder();
//添加相应事件处理
h.ReelChangeEvent += ReelChangeHandler;
return h;
}
}

//对应的事件处理函数
public void ReelChangeHandler(object sender, CustomEventArgs Args)
{
Console.WriteLine("Chart: Event ReelChange");
}

在主程序中对应位置调用触发器

1
2
3
4
5
//触发事件:换卷
foreach (PluginInterface.IPlugin p in plugins)
{
p.hanlder.Trigger(this,new CustomEventArgs(null,CustomEvent.ReelChangeEvent));
}