【问题标题】:Detaching events (C#)分离事件 (C#)
【发布时间】: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。我不知道为什么这对我来说不会分离。

感谢您的宝贵时间!

【问题讨论】:

  • 我会先分离出由不同事件触发的事件订阅/取消订阅。对我来说,单击一个按钮调用两个事件处理程序令人困惑
  • 为什么这些函数(HookEventUnhookEvent)实际上只是让潜在的调用者直接使用+=标准)语法订阅活动?
  • new Button() 永远不会是正确的。您需要使用正确的按钮控件引用,而不是从头开始创建新控件。
  • new EventHandler(...) 已过时。假设签名与事件的类型匹配,您可以直接对您的操作执行 += / -=。
  • @Damien_The_Unbeliever 它没有真正的优点,也没有真正的充分理由。这是我想我会尝试并玩弄的东西。

标签: c# events event-handling


【解决方案1】:

您正在钩子和取消钩子方法中创建一个新的EventHandler。所以你没有附加OnButtonClick,而是一个包装器。

将你的钩子方法更改为:

public void HookEvent(EventHandler action) {
    Click += action;
}
public void UnhookEvent(EventHandler action) {
    Click -= action;
}

您的其余代码应该仍然可以工作,并且您的事件现在应该可以正常触发了。

【讨论】:

  • 哦,我明白了。这确实更有意义。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-14
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
  • 2012-03-24
相关资源
最近更新 更多