【问题标题】:only one C# event handler being invoked仅调用一个 C# 事件处理程序
【发布时间】:2014-05-02 16:13:21
【问题描述】:

我(不可否认)的理解是,您应该能够向 C# 事件添加任意数量的委托,并且它们都会被调用(以某种未定义的顺序)。但在我的项目中似乎并非如此。我把它归结为添加到 NSButton 的 Activated 事件中的两个代表(这是在 MonoMac 中),如下所示:

nsButton = new NSButton(new System.Drawing.RectangleF(0, 0, 100, 100));
nsButton.StringValue = "Click me!";

nsButton.Activated += delegate(object sender, EventArgs e) {
    Console.WriteLine("Handler 1!");
};
nsButton.Activated += delegate(object sender, EventArgs e) {
    Console.WriteLine("Handler 2?");
};

(当然,然后这个按钮被添加到一个窗口中)。当我单击它时,我会看到“处理程序 1!”但我没有看到“处理程序 2?”出现在控制台中。如果我注释掉添加处理程序 1 的行,则处理程序 2 会触发。

它的行为就像只有添加的第一个委托有效,而任何后续委托都被忽略了。但这违背了我能找到的关于 C# 中的事件应该如何工作的一切。我做错了什么?

【问题讨论】:

  • 考虑查看源代码(假设您可以获得一个或使用 ILSpy 之类的东西进行反编译) - 正如 Servy(+1) 回答指出的那样,您描述了控件不需要使用的默认行为。
  • 是的,我一直在搜索源代码,但还没有找到。我怀疑这确实是 NSButton 特有的东西,因为在 iOS 上连接到 UIButton 的 TouchUpInside 事件的几乎相同的代码可以正常工作。
  • 在 Xamarin 的帮助下,我设法从 MonoMac 更新到 Xamarin.Mac。但是这种行为是一样的。仍然没有设法找到任何关于这是否是预期行为的官方消息或文档。

标签: c# events delegates mono monomac


【解决方案1】:

这实际上是一个错误。我在这里提交:

https://bugzilla.xamarin.com/show_bug.cgi?id=19619

【讨论】:

    【解决方案2】:

    值得注意的是,您描述了事件应该的行为方式,而不是它们必须的行为方式。如果需要,定义事件的类型可以忽略这些准则,并且不会保留多个处理程序。不过,这并不是您在几乎所有事件中都会看到的行为,因为它们必须竭尽全力才能产生这种行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-25
      相关资源
      最近更新 更多