防止事件C#冒泡

时间:2011-05-10 02:46:42

标签: c# .net windows

假设我有各种类订阅的事件KeyPress。假设A类也在表格上订阅KeyPress,B类也订阅KeyPress

现在我希望这些类中只有一个应该处理Form在运行时触发的事件。那就是说A类首先处理,我尝试使用e.Handled = true,但在这种情况下没有帮助。

如果A类已经处理过,我不希望B类处理从表单触发的事件,我目前有一个解决方法,包括在A和B中设置一些公共标志,但这不是一个好主意的软件工程原理,我希望这些类尽可能彼此独立,但同时应该知道一个事件已经被处理过,不需要再次处理。

这可能吗?

是的,有可能,需要检查e.Handled == true,.NET负责其余的事情: - )

1 个答案:

答案 0 :(得分:10)

您必须检查每个事件处理程序中的e.Handled,例如我创建的Gist example

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

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

相关问题