问题 防止事件C#冒泡


假设我有一个事件 KeyPress 订阅各种类。假设A类也订阅 KeyPress 在表格和B类也订阅 KeyPress

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

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

那可能吗?

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


10707
2018-05-10 02:46


起源

当你说尝试使用'e.Handled = true'时,你是否在A和B中使用了e.Handled在处理它之前是真的吗? - Arjang
不,我在想e.Handled == true wud不会在另一堂课中提出这个事件 - redDragonzz
在这种情况下,让事件被提出,但让班级决定是否接受处理。 - Arjang


答案:


您必须检查每个事件处理程序中的e.Handled 要点示例 我创建。

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

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


10
2018-05-10 03:08



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