e.Handeld = true和取消订阅事件之间的区别?

时间:2017-05-10 07:46:34

标签: c# events delegates

我有一个事件处理程序,由于某种原因(我不明白)被调用两次,我认为设置e.Handled = true将解决它,但它没有,最后我取消订阅处理程序中的事件,它可以工作:

((FabTabItem)sender).TabClosing -= oTab_TabClosing;

所以我有这些问题:

  • 两个方法之间有什么区别,他们不会停止处理这个事件?
  • 可以取消订阅其处理程序中的事件,因为它很自然地说"在事件被处理后停止听取事件"? (我不经常看到这一点)

2 个答案:

答案 0 :(得分:1)

来自KeyPressEventArgs.Handled属性的以下MSDN页面:

  

如果未处理该事件,它将被发送到操作系统进行默认处理。

因此将其设置为true意味着对事件的其余调用不会对事件进行任何进一步处理,具体取决于其他事件如何处理Handled属性。正如@Enigmativity将其放在对OP的评论中:

  

当你有一个处理程序用于一个事件时,它们会被串联调用。如果其中一个处理程序认为它已经处理了#34;事件并没有其他处理程序需要做任何可以设置e.Handled = true的事情。接下来的处理程序要尊重这个标志而不进行任何处理 - 但它们仍然被调用。此事也没有改变下次引发事件时的处理 - 所有处理程序再次被调用。

通过取消订阅事件,事件中的其余操作仍然会发生,在上述事件的情况下,它仍然会进入操作系统。

您描述的两种情况并不完全相同。

取消订阅处理程序本身内部的事件很好,它所做的就是在下次引发事件时删除对该处理程序的调用。

如果你这样说,因为事件被调用的次数超过它应该的次数,你应该追踪事件的订阅位置。很可能你不小心订阅了同一个处理程序两次,这是正确的修复,而不是通过取消订阅事件来解决它。

答案 1 :(得分:0)

  

这两种方法之间有什么区别,他们不会处理这个事件吗?

e.Handled = true;表示事件处理程序已经处理了事件并处理了它,因此不需要进一步处理它。换句话说,请不要采取任何进一步行动。

但第二次将删除事件而Don将在下次发生

  

可以取消订阅其处理程序中的事件,因为很自然地说"在事件被处理后停止听取事件"? (我不经常看到这一点)

如果您想要在使用句柄之后不想发生它依赖于您的Roll,但如果您希望在使用之后永远不会发生 并删除事件