防止C#事件冒泡

13
假设我有一个事件由各种类订阅。假设A类还订阅了表单上的,B类也订阅了。
现在我希望只有其中一个类处理运行时表单触发的事件。也就是说,假设A类先处理,我尝试使用e.Handled = true,但在这种情况下没有帮助。
如果A类已经处理了来自表单的事件,我不希望B类再次处理它,我目前有一个解决方法,其中涉及在A和B内设置一些公共标志,但从软件工程原则上讲,这并不是个好主意。我希望各个类尽可能地独立,但同时应该知道一个事件已经被处理过,不需要再次处理。
这是否可能?
是的,可以实现这一点,需要检查 e.Handled == true,然后 .NET 会处理剩余的部分 :-)

1
当您说尝试使用“e.Handled = true”时,您是否在处理它之前检查了A和B中的e.Handled是否为true? - jimjim
不,我认为 e.Handled == true 不会在另一个类中引发事件。 - redDragonzz
在这种情况下,让事件被触发,但让类自行决定是否处理它。 - jimjim
1个回答

12

您需要在每个事件处理程序中检查 e.Handled 的值,就像我创建的这个代码片段示例所示。

基本上每个事件处理程序都需要检查 e.Handled == true,并且如果已经处理过,则返回。Handled 属性并不会短路事件处理,它只是将参数传递到每个订阅的事件。

在我的示例中,Form1 类始终首先处理事件,因为它在 Form1 构造函数中被连接。因此,在该事件中设置 e.Handled = true,然后在其他事件中检查 e.Handled == true,即可在 e.Handled == true 时立即返回。


哦,我没有检查 e.Handled == true。该死!!谢谢 :) - redDragonzz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接