我有一个事件处理程序,由于某种原因(我不明白)被调用两次,我认为设置e.Handled = true
将解决它,但它没有,最后我取消订阅处理程序中的事件,它可以工作:
((FabTabItem)sender).TabClosing -= oTab_TabClosing;
所以我有这些问题:
答案 0 :(得分:1)
来自KeyPressEventArgs.Handled
属性的以下MSDN页面:
如果未处理该事件,它将被发送到操作系统进行默认处理。
因此将其设置为true
意味着对事件的其余调用不会对事件进行任何进一步处理,具体取决于其他事件如何处理Handled
属性。正如@Enigmativity将其放在对OP的评论中:
当你有一个处理程序用于一个事件时,它们会被串联调用。如果其中一个处理程序认为它已经处理了#34;事件并没有其他处理程序需要做任何可以设置e.Handled = true的事情。接下来的处理程序要尊重这个标志而不进行任何处理 - 但它们仍然被调用。此事也没有改变下次引发事件时的处理 - 所有处理程序再次被调用。
通过取消订阅事件,事件中的其余操作仍然会发生,在上述事件的情况下,它仍然会进入操作系统。
您描述的两种情况并不完全相同。
取消订阅处理程序本身内部的事件很好,它所做的就是在下次引发事件时删除对该处理程序的调用。
如果你这样说,因为事件被调用的次数超过它应该的次数,你应该追踪事件的订阅位置。很可能你不小心订阅了同一个处理程序两次,这是正确的修复,而不是通过取消订阅事件来解决它。
答案 1 :(得分:0)
这两种方法之间有什么区别,他们不会处理这个事件吗?
e.Handled = true;表示事件处理程序已经处理了事件并处理了它,因此不需要进一步处理它。换句话说,请不要采取任何进一步行动。
但第二次将删除事件而Don将在下次发生
可以取消订阅其处理程序中的事件,因为很自然地说"在事件被处理后停止听取事件"? (我不经常看到这一点)
如果您想要在使用句柄之后不想发生它依赖于您的Roll,但如果您希望在使用之后永远不会发生 并删除事件