目前我正在构建一个自定义按钮处理程序(我需要将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);
}
}
}
答案 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等多个事件处理程序。但是,由于您将事件处理程序及其代理存储在字典中,因此将=
更改为+=
只能以与上述代码中所示相同的方式工作。