假设我有一个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时立即返回。