防止事件C#冒泡

假设我有一个KeyPress由各个类订阅的事件。 假设类A也在表单上订阅了KeyPress ,而类B也订阅了KeyPress

现在我希望只有其中的一个类能够在运行时处理Form触发的事件。 这就是说,首先处理类A,我已经尝试使用e.Handled = true但是在这种情况下不起作用。

如果A类已经处理了,我不希望B类来处理从表单中发起的事件,我现在有一个解决方法,在A和B中设置一些公共标志,但是这不是一个从软件工程原理的好主意,我希望class级尽可能相互独立,但同时应该知道一个事件已经被处理了,不需要再处理。

那可能吗?

是的,这是可能的,需要检查e.Handled == true和.NET处理其余的:-)

你必须在每个事件处理程序中检查e.Handled,就像我创建的Gist例子 。

基本上每个处理程序需要检查e.Handled == true,如果已经处理,则返回。 Handled属性不会将事件处理短路,只会将参数压入每个订阅事件。

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