之后开发日志不再按照日期命名
某个功能需求要求插件实现在主程序满足特定条件时触发函数调用,因此需要在框架和接口中添加自定义事件处理,通过事件触发的方式来在主程序中插入插件的功能函数。
# 自定义事件处理 定义
添加定义事件类 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)); }
|