多个调用一个代表

时间:2012-10-08 05:22:10

标签: c# dictionary delegates

目前我正在构建一个自定义按钮处理程序(我需要将kinect集成到也使用了鼠标的按钮系统中)然后我遇到了一个叫做事件处理的可怕事情..至少一个小时在我的电脑上大喊:P。我想知道,在我花了一段时间改变我的系统以允许我的新需求,即每个处理程序有多个事件,我想知道,是我要尝试工作的方式(我会尝试,但是我要过夜了,所以我希望明天启动计算机可以节省一些时间,而不是尝试我的系统不是为它设计的。)

另外,在我编码之前,我已经看过一个getInvoc列表或类似的东西..我会在其上添加多个委托然后获取该列表并对其进行itterate吗?

在之前的例子中,我看到过人们使用过的地方:

public event EventHandler myEventHandler;

我不得不使用:

private Dictionary<BtnEvent, Delegate> m_events;

然后他们做了以下添加处理程序(他们的方式,而不是我的):

myObj.myEventHandler += delegate(object sender, EventArgs ea)
{
     //do stuff on event
};

首先..如果他们运行了两次,一次使用funcA,第二次使用funcb,它会同时运行吗?还是只有一个?

第二,如果我将+ =的逻辑应用于代表,它会起作用吗? (我必须使用Delegate,因为我将处理程序存储在字典中,这允许通过使用枚举对处理程序进行逻辑访问)

(我的代码)

private Dictionary<BtnEvent, Delegate> m_events;

//....

m_events = new Dictionary<BtnEvent, Delegate>(6);
m_events.Add(BtnEvent.CLICK_ENTER,  null);
m_events.Add(BtnEvent.CLICK_LEAVE,  null);
m_events.Add(BtnEvent.CLICK_STAY,   null);
m_events.Add(BtnEvent.HOVER_ENTER,  null);
m_events.Add(BtnEvent.HOVER_LEAVE,  null);
m_events.Add(BtnEvent.HOVER_STAY,   null);

//....

public bool addHandle(BtnEvent stateToGet, Delegate function)
{
    bool success = false;

    if(m_events.ContainsKey(stateToGet))
    {
        m_events[stateToGet] = function;
    }

    return(success);
}

// CHANGE ABOVE TO:

public bool addHandle(BtnEvent stateToGet, Delegate function)
{
    bool success = false;

    if(m_events.ContainsKey(stateToGet))
    {
        m_events[stateToGet] += function;
    }

    return(success);
}

将改变m_events [stateToGet] = function;到m_events [stateToGet] + = function;允许我通过以下代码调用多个事件句柄(传递给addHandle的函数)?

private void ExecuteEvent(BtnEvent currEvent)
{
    if(m_events.ContainsKey(currEvent))
    {
        if(m_events[currEvent] != null)
        {
           m_events[currEvent].DynamicInvoke(null);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

请参阅以下代码,以回答您的第一个问题:

public partial class Form1 : Form
    {    
        public Form1()
        {
            InitializeComponent();
            this.Load += new EventHandler(Form1_Load);
        }

        void Form1_Load(object sender, EventArgs e)
        {
            funcA();
            funcB();
        }

        private void funcA()
        {
            button1.Click += new EventHandler(button1_Click);
        }

        private void funcB()
        {
            button1.Click += new EventHandler(button1_Click);
        }

        void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("I am in event handler");
        }

    }

单击按钮时,“我在事件处理程序”消息显示两次,这意味着+=运算符与委托以类似的方式工作,因为它使用整数或字符串。它只是将函数处理程序添加到队列中,并在执行事件时调用队列中的所有函数指针。

关于您的第二个问题,我认为您不会通过将=更改为+=来实现预期的行为。我从您的陈述中理解的是,您希望在调用ExecuteEvent()函数时执行CLICK_ENTER,CLICK_LEAVE等多个事件处理程序。但是,由于您将事件处理程序及其代理存储在字典中,因此将=更改为+=只能以与上述代码中所示相同的方式工作。