【问题标题】:Disable form while BackgroundWorker is busy?BackgroundWorker 忙时禁用表单?
【发布时间】:2009-09-16 02:29:42
【问题描述】:

我不希望用户在某个后台工作人员忙(工作)时与我的应用程序进行交互。我创建了这个 bgw,以便应用程序在工作时看起来不会冻结。但现在用户可以在应用程序中四处走动。如何禁用我的表单/应用程序?

谢谢!

【问题讨论】:

  • 如果您要在将代码移至后台时禁用表单,那么将其移至后台有什么意义?
  • 因为没有后台工作程序,如果用户尝试与之交互,Windows 会说应用程序“无响应”。

标签: c# backgroundworker


【解决方案1】:

也许将Enabled 设置为false

this.Enabled = false;

这有点过激,因为它还可以防止表单被移动、调整大小或关闭事件。更好的方法是将Panel 控件放入具有Dock = Fill 的表单中,并将我们的其他控件放入该Panel。然后,您可以改为使用PanelEnabled 属性来防止进一步的用户输入。

注意认为用户能够关闭表单,因此应该以某种方式优雅地处理。

【讨论】:

  • 这是一种快速而肮脏的方法,但它可能比禁用用户可以交互的表单上的每个控件更好(取决于您的情况)。
  • @Michael:禁用表单确实又快又脏 :o)
  • 谢谢,我做了类似于迈克尔建议的事情。
  • 还有 Fredrik 对他原始答案的补充...谢谢!
  • 使用这个我无法将鼠标光标更改为 Cursors.WaitCursor :(
【解决方案2】:

您还可以创建一个模式“忙碌启动”对话框,该对话框在后台任务启动时显示,并在任务结束时以编程方式删除。你也可以在那个盒子里放一个小动画,让用户知道正在发生的事情。您还需要确保他们不会手动关闭对话框(只允许以编程方式关闭它)。

【讨论】:

  • 这可能是一个很好的技巧,尤其是当您希望主窗体保持可见和不变时。您甚至可以使用非常小的或隐藏的 DialogForm。
  • 我所做的另一件事是将表单中的所有内容都包含在面板中,然后隐藏面板并显示“忙碌”消息。这样就无法与底层控件进行交互。
【解决方案3】:

我同意@michael-todd 在他上面的评论中,禁用个别控件/导航按钮/等。而后台工作人员正在工作似乎是一个相当不错的解决方案。这将使您能够对用户在特定后台操作期间可以执行的操作进行细粒度控制。

你可以:

  1. 创建方法以启用或禁用所有适当的导航/交互控件(通过将其 Enabled 属性设置为 true/false 等,以适合每个控件)
  2. 在后台工作程序上调用 StartWorkerAsync() 之前,从代码中调用“禁用”方法
  3. 在 RunWorkerCompleted 的事件处理程序中,调用“Enable”方法以重新启用视图以供用户输入

【讨论】:

    【解决方案4】:

    通过将某些控件放置在面板中并禁用该面板而不是禁用单个控件来管理禁用某些控件更容易:

    controlPanel.Enabled = false;
    

    阻止其他可能满足您需求的任务的常用方法是显示带有进度条的最顶部表单。我过去成功地实现了这一点。其他程序做同样的事情。例如,在 WinRAR 中,当应用程序忙于提取或压缩文件时,应用程序会显示最顶层的表单。它看起来像一个“模态”表单,但实际上,您仍然可以单击其他功能,WinRAR 会询问“您希望中止当前操作吗?”

    禁用整个应用程序通常不是必需的,而且可能不直观。所以,问问自己是否真的需要阻止与表单的交互。例如,我有一个应用程序需要一些时间才能完成某些任务。我为该特定工作提供了一个进度条指示器,但您仍然可以与应用程序交互以启动同时运行的其他任务。即使我一次只允许您执行一项任务,您仍然可能希望在任务运行时查看帮助文件或设置应用程序首选项。此外,我给用户一个按钮,允许他们停止任务。禁用表单会阻止这种类型的交互。

    【讨论】:

      【解决方案5】:

      另一种可能的方法是“过滤掉”应用程序的所有输入。 这可以通过听“KeyDown”和“MouseButtonDown”来完成。 触发后台作业后,您可以将 FILTER_INPUT 标志设置为 true 并在完成后将其重置。 如果设置了 FILTER_INPUT 标志,则可以取消所有键和鼠标事件。

      这可能不是最有效的,因为所有按键和点击都将通过过滤器检查。

      【讨论】:

        猜你喜欢
        • 2023-03-22
        • 1970-01-01
        • 2019-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多