假设我有各种类订阅的事件KeyPress
。假设A类也在表格上订阅KeyPress
,B类也订阅KeyPress
现在我希望这些类中只有一个应该处理Form在运行时触发的事件。那就是说A类首先处理,我尝试使用e.Handled = true
,但在这种情况下没有帮助。
如果A类已经处理过,我不希望B类处理从表单触发的事件,我目前有一个解决方法,包括在A和B中设置一些公共标志,但这不是一个好主意的软件工程原理,我希望这些类尽可能彼此独立,但同时应该知道一个事件已经被处理过,不需要再次处理。
这可能吗?
是的,有可能,需要检查e.Handled == true
,.NET负责其余的事情: - )
答案 0 :(得分:10)
您必须检查每个事件处理程序中的e.Handled,例如我创建的Gist example。
基本上每个处理程序都需要检查e.Handled == true,如果已经处理则返回。 Handled属性不会使事件处理短路,它只会将每个订阅事件的参数下推。
在我的示例中,Form1类始终首先处理事件,因为它是在Form1构造函数中连接的。因此,通过在该事件中设置e.Handled = true然后在其他事件中检查e.Handled == true,我可以在e.Handled == true时立即返回。