0

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

另外,我在编码之前看到了一个 getInvoc 列表或类似的东西。我会在上面添加多个代表,然后获取该列表并对其进行迭代吗?

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

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] += 函数;允许我通过以下代码调用多个事件句柄(我传递给 addHandle 的函数)?

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

1 回答 1

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。但是,由于您将事件处理程序及其委托存储在 Dictionary 中,因此更改=+=只能以与上述代码所示相同的方式工作。

于 2012-10-08T05:47:05.420 回答