我正在添加事件处理程序,如下所示:
theImage.MouseMove += new MouseEventHandler(theImage_MouseMove);
但在我的应用程序中,此代码会在每次页面显示时运行,因此我只想附加一次的事件处理程序,但如何才能我告诉是否已经设置了处理程序,如下所示:
if(theImage.MouseMove == null) //error
theImage.MouseMove += new MouseEventHandler(theImage_MouseMove);
答案 0 :(得分:1)
我可能会遗漏一些东西,但是如果你只是想确保只调用一次句柄,为什么不在添加它之前使用-=
。像这样:
public static void Main(string[] args)
{
var timer = new Timer(1000);
timer.Elapsed -= new ElapsedEventHandler(timer_Elapsed);
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
timer.Elapsed -= new ElapsedEventHandler(timer_Elapsed);
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
timer.Start();
System.Threading.Thread.Sleep(4000);
}
static void timer_Elapsed(object sender, ElapsedEventArgs e)
{
Console.WriteLine("Hit!");
}
处理程序每秒只运行一次。
答案 1 :(得分:1)
如果您只想附加一次,可以缩短它:
theImage.MouseMove -= theImage_MouseMove; //If it wasn't attached, doesn't matter
theImage.MouseMove += theImage_MouseMove;
答案 2 :(得分:1)
我不确定这是否是最佳解决方案,但我通常这样做的方法是在订阅之前简单地使用取消订阅。
如果您执行以下操作:
TheImage.MouseMove -= new MouseEventHandler(theImage_MouseMove);
TheImage.MouseMove += new MouseEventHandler(theImage_MouseMove);
它只会被添加一次。如果它尚未存在(第一次被触发), - =如果之前没有订阅,则不会伤害任何内容。
答案 3 :(得分:-1)
theImage.MouseMove.GetInvocationList().Length