【问题标题】:Is there anyway to stop the flow of events in .NET?有没有办法阻止 .NET 中的事件流?
【发布时间】:2012-05-23 13:03:07
【问题描述】:

这是我一直在问自己的问题。

给定一定的事件流,我可以在处理其中一个事件时,停止接下来要引发的事件吗?

例如,当折叠在 treeview (winform) 中选择了哪个子节点时,会像这样引发事件:

  • 折叠前
  • 选择前
  • 选择后
  • 折叠后

我可以通过使用类成员来阻止它们,但我想知道是否有内置函数或其他方式(更优雅的方式)可以通过直接作用于事件队列来实现这一点。

有什么想法吗?

【问题讨论】:

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

标签: c# .net vb.net winforms events


【解决方案1】:

不容易,不。事件触发的顺序由 TreeView 控件类控制,并且没有内置的方法来阻止事件触发。但您有两种选择:

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

【讨论】:

  • 好的,我认为他们应该在 .NET 5 框架中添加这个功能,因为这不是我第一次愿意做这样的事情
  • 我不确定他们是否会在 WinForms 上投入那么多。在可预见的未来,他们更有可能专注于 WPF 和 WinRT。
【解决方案2】:

不,对于 that 类型的事件(您要求 TreeView),没有办法做到这一点。

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

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

或者您可以,取消订阅您不希望收到更多的事件,但在再次订阅之后。听起来很粗糙的解决方案,但有时结果是合理的。

【讨论】:

  • 我无法访问控件的事件来取消订阅,我猜是因为它们是内置事件。谢谢回答
  • @GianT971:在这种情况下,用你自己的“switch”变量来管理它。
  • 是的,它会比创建自定义控件更简单更快
【解决方案3】:

即使引发了事件,如果您不将事件处理程序绑定到它们,也不会发生任何事情。在这种情况下,您可以使用以下代码删除处理程序:

object.Event -= new EventHandlerType(your_Method)

否则你应该创建自己的自定义控件

【讨论】:

  • 好的,但我无法访问此控件中的任何 Event 属性
  • 在这种情况下,您必须创建自己的自定义控件。但是,如果没有事件处理程序,为什么需要阻止它被引发?
  • 我的意思是输入 MyTreeview.Event 会导致错误。 MyTreeview.BeforeCollapse 也是如此。
  • 然后你必须创建你的自定义控件
【解决方案4】:

根据OnBeforeCollapse,你会得到一个TreeViewCancelEventArgs,它有一个Cancel 属性。将此设置为 true 应该会停止流程,但也不会折叠它。 OnBeforeSelect 也是如此。

【讨论】:

    【解决方案5】:

    唯一可以轻松“取消”事件的情况是事件处理程序具有CancelEventHandler 委托类型。即使这样,它并没有真正取消它,而是为剩余事件设置一个标志,使其跳过执行所有订阅的事件。

    如果您确实CancelEventHandler 类型(这些类型没有),您只需在处理程序中将事件对象本身的 Cancel 设置为 true。

    许多其他答案为您提供了您应该做什么的建议。我只是按照你的想法去做:在你的控制类中设置一个“事件取消”标志,然后检查它。当系列中的最后一个事件被调用时,重置它。

    【讨论】:

      猜你喜欢
      • 2019-10-20
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 2020-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多