【发布时间】:2013-06-26 00:49:32
【问题描述】:
我有一个从事件中正确分离 EventHandler 的小问题。这是我正在使用的:
在 UIButton 中:
public void HookEvent(Action<object, EventArgs> action)
{
Click += new EventHandler(action);
}
public void UnhookEvent(Action<object, EventArgs> action)
{
Click -= new EventHandler(action);
}
在主要:
UIButton button = new Button();
button.HookEvent(OnButtonClick);
button.UnhookEvent(OnButtonClick);
被钩住的函数:
public void OnButtonClick(object sender, EventArgs e)
{
throw new Exception("Event Fired");
}
如果我注释掉 Unhook 行,它会正确通过并调用 Exception。但是,如果我将其保留为如上所示,并且 Unhook 仍然存在......该功能仍然会触发。它不会解开它。如果我在Click -= new EventHandler(action); 部分下方添加Click = null;,那么它会按预期工作。这样做会导致在任何给定时间只允许挂钩一个函数。
我唯一想到可能发生的事情是,自从我使用 Action 以来,正在传入该函数的新版本,但可惜我什至尝试将该函数作为变量存储在按钮内,当我去的时候要删除它,if(storedAction == passedInAction) 的结果为 true。我不知道为什么这对我来说不会分离。
感谢您的宝贵时间!
【问题讨论】:
-
我会先分离出由不同事件触发的事件订阅/取消订阅。对我来说,单击一个按钮调用两个事件处理程序令人困惑
-
为什么这些函数(
HookEvent,UnhookEvent)实际上只是让潜在的调用者直接使用+=(标准)语法订阅活动? -
new Button()永远不会是正确的。您需要使用正确的按钮控件引用,而不是从头开始创建新控件。 -
new EventHandler(...)已过时。假设签名与事件的类型匹配,您可以直接对您的操作执行 += / -=。 -
@Damien_The_Unbeliever 它没有真正的优点,也没有真正的充分理由。这是我想我会尝试并玩弄的东西。
标签: c# events event-handling