有没有办法阻止.NET中的事件流?
这是我一直在问自己一阵子的问题。有没有办法阻止.NET中的事件流?
给予一定的事件流程,我可以在处理其中一个事件时,停止下一个要提出的事件?
例如,塌陷该孩子在树状(WinForm的)中选择一个节点时,该事件被触发这样的:
- BeforeCollapse
- BeforeSelect
- AfterSelect
- AfterCollapse
我可以阻止他们通过使用cla ss成员,但我想知道是否有内置函数或者只是通过直接在事件队列中执行的另一种方式(更优雅的方式)来实现此目的。
有什么想法?
,没有。事件触发的顺序由TreeView控件类控制,并且没有防止事件触发的内置方法。但是,你有两个选择:
- 创建一个从基类继承自己的TreeView类, 然后添加一个
bool
属性,以防止处理的事件。 然后在调用base.BeforeCollapse
之前,您可以覆盖BeforeCollapse
等检查bool 。 - 只需创建一个
bool
标志,并检查每个事件中的标志。
不,没有办法做到这一点事件的类型(你要求的是TreeView)。
例如可以通过内置机制管理KeyEventArgs.Handled。
你可以使用一些实例(布尔?)值来管理流动,
或者你可以,退订从您不希望收到更多,但重新订阅之后的事件。听起来粗略的解决方案,但有时会变成合理的。
根据OnBeforeCollapse你得到一个TreeViewCancelEventArgs它有一个Cancel
财产。将其设置为true应该停止流程,但也不会折叠它。 同样适用于OnBeforeSelect
。
只有当事件处理程序具有CancelEventHandler
委托类型时,您才可以轻松“取消”某个事件。尽管如此,它并没有真正取消它,而是为剩下的事件设置了一个标志,使其跳过执行所有订阅它的事件。
如果没有有CancelEventHandler
类型(这些不)你只需设置Cancel
为true事件对象本身在处理程序上。
很多其他答案给你你应该做什么的建议。我只是想你的想法:在你的控制类中设置一个'取消事件'标志,并检查它。当系列中的最后一个事件被调用时,重置它。
也许这就是他们所说的自定义控件。 – V4Vendetta