有没有办法阻止.NET中的事件流?

问题描述:

这是我一直在问自己一阵子的问题。有没有办法阻止.NET中的事件流?

给予一定的事件流程,我可以在处理其中一个事件时,停止下一个要提出的事件

例如,塌陷该孩子在树状(WinForm的)中选择一个节点时,该事件被触发这样的:

  • BeforeCollapse
  • BeforeSelect
  • AfterSelect
  • AfterCollapse

我可以阻止他们通过使用cla ss成员,但我想知道是否有内置函数或者只是通过直接在事件队列中执行的另一种方式(更优雅的方式)来实现此目的。

有什么想法?

+0

也许这就是他们所说的自定义控件。 – V4Vendetta

,没有。事件触发的顺序由TreeView控件类控制,并且没有防止事件触发的内置方法。但是,你有两个选择:

  1. 创建一个从基类继承自己的TreeView类, 然后添加一个bool属性,以防止处理的事件。 然后在调用base.BeforeCollapse之前,您可以覆盖BeforeCollapse等检查bool 。
  2. 只需创建一个bool标志,并检查每个事件中的标志。
+0

好的,我认为他们应该在.NET 5框架中添加这个函数,因为这不是我第一次愿意做那样的事情 – GianT971

+0

我不确定他们会去在WinForms中投入了大量资金。在可预见的未来,他们更可能将重点放在WPF和WinRT上。 – mgnoonan

不,没有办法做到这一点事件的类型(你要求的是TreeView)。

例如可以通过内置机制管理KeyEventArgs.Handled

你可以使用一些实例(布尔?)值来管理流动,

或者你可以,退订从您不希望收到更多,但重新订阅之后的事件。听起来粗略的解决方案,但有时会变成合理的。

+0

我无法访问控件的事件来取消它们,我猜这是因为它们是内置事件。 Thx回答 – GianT971

+0

@ GianT971:在这种情况下,用您自己的“开关”变量进行管理。 – Tigran

+0

是的,它会比创建自定义控件更加简单快捷 – GianT971

即使事件发生,如果您不绑定事件处理程序,也不会发生任何事情。在这种情况下,你可以使用下面的代码只是删除处理程序:

object.Event -= new EventHandlerType(your_Method) 

否则你不应该很容易地创建自己的自定义控制

+0

好的,但是我可以在此控件中访问没有Event属性 – GianT971

+0

您必须在这种情况下创建自己的自定义控件。但是如果没有事件的处理程序,为什么你需要防止它被提出? –

+0

我的意思是输入MyTreeview.Event会导致错误。 MyTreeview.BeforeCollapse也是如此。 – GianT971

根据OnBeforeCollapse你得到一个TreeViewCancelEventArgs它有一个Cancel财产。将其设置为true应该停止流程,但也不会折叠它。 同样适用于OnBeforeSelect

只有当事件处理程序具有CancelEventHandler委托类型时,您才可以轻松“取消”某个事件。尽管如此,它并没有真正取消它,而是为剩下的事件设置了一个标志,使其跳过执行所有订阅它的事件。

如果没有CancelEventHandler类型(这些不)你只需设置Cancel为true事件对象本身在处理程序上。

很多其他答案给你你应该做什么的建议。我只是想你的想法:在你的控制类中设置一个'取消事件'标志,并检查它。当系列中的最后一个事件被调用时,重置它。