在一个插件平台系统的开发中需要在主界面上对用户自定义控件中的事件进行响应,由于用户控件是使用反射动态加载的,因此需要在反射中对事件进行响应。
即将用户控件中的Button 的Click事件委托给主界面中的函数响应。
用户控件:
namespace StatisticPlugin { //delegate public delegate void LOSClickHandle(Object sender, EventArgs e); public partial class Statistic : UserControl { //event public event LOSClickHandle LOSClick; public Statistic() { InitializeComponent(); } private void btnLOSClicked(Object sender, EventArgs e) { if (LOSClick != null) LOSClick(sender, e); } } }
主界面
public partial class MainWindow : Window
{
//...//
public void Initialization()
{
Assembly asm = Assembly.LoadFrom("..\\..\\..\\Plugins\\Statistic.dll");
Type[] types = asm.GetExportedTypes();
Type type = types[0];
Object objStatistic = Activator.CreateInstance(type);
EventInfo LOSClick = type.GetEvent("LOSClick");
Type handlerType = LOSClick.EventHandlerType;
MethodInfo eventHandler = typeof(MainWindow).GetMethod("onLOSClicked",
BindingFlags.NonPublic |BindingFlags.Instance);
Delegate delegateLOS = Delegate.CreateDelegate(handlerType,
this, eventHandler,true);
LOSClick.AddEventHandler(objStatistic, delegateLOS);
}
private void onLOSClicked(object sender, Event e)
{
//...//
}
要点:
1.在用户自定义控件(Window)中将Window中的Button的Click事件委托给主界面Window的函数实现事件的响应。
2.在反射得到的用户自定义控件对象中查找该事件,并将其委托给指定函数。