防止事件C#冒泡

red*_*nzz 11 .net c# windows

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

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

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

那可能吗?

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

小智 10

您必须检查每个事件处理程序中的e.Handled,就像我创建的这个Gist示例一样.

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

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