繁体   English   中英

注册/注销事件处理程序的通用方法

[英]Generic method to register/unregister event handler

我试图找出一种使事件注册和注销与我的初始化和清除保持同步的方法。 我想要的是能够调用通用方法来注册或注销事件,并且仅传递布尔值来进行操作。

我不想与Window一起使用,但这只是一个简单的示例。

class EventSample
{
    private Window myWindow;

    public EventSample(Window window)
    {
        myWindow = window;
        InitEvent(true);
    }

    ~EventSample()
    {
        InitEvent(false);
    }

    private void InitEvent(bool register)
    {
        // I want a generic similar to that
        RegisterEvent(register, myWindow.Activated, MyWindow_Activated);
        RegisterEvent(register,myWindow.Closed , MyWindow_Closed);
        RegisterEvent(register, myWindow.Closing ,MyWindow_Closing);
    }



    private void MyWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {

    }

    private void MyWindow_Closed(object sender, EventArgs e)
    {
    }

    private void MyWindow_Activated(object sender, EventArgs e)
    {

    }
}

我在清理方法上也遇到过类似的问题。 我已经解决了这一问题,方法是保留处理窗口或控件时要执行的动作的列表。

像这样:

this.RegisterEvent
    ( () => this.Event += handler
    , () => this.Event -= handler
    );

RegisterEvent执行(在我的情况下为延迟)事件附件:

private List<Action> unregisterEvents = new List<Action>();

private void RegisterEvent(Action registerAction, Action unregisterAction)
{
    registerAction.Invoke();

    unregisterEvents.Add(unregisterAction);
}

处理时,只需遍历注销事件即可:

foreach (Action a in unregisterEvents)
{
    a.Invoke();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM