在BackgroundWorker忙的时候禁用表单?

时间:2009-09-15 17:13:50

标签: c# backgroundworker

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

谢谢!

5 个答案:

答案 0 :(得分:14)

也许将Enabled设为false

this.Enabled = false;

但这有点激烈,因为它还可以防止表单移动,调整大小或关闭事件。更好的方法是在表单中添加Panel控件,其中包含Dock = Fill,并将其他控件放入Panel。然后,您可以使用Enabled的{​​{1}}属性来阻止进一步的用户输入。

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

答案 1 :(得分:4)

您还可以创建一个模式“busy splash”对话框,该对话框在后台任务启动时显示,并在任务结束时以编程方式删除。您也可以在该框中放置一些动画,让用户知道某些事情正在发生。您还需要确保它们不会手动关闭对话框(仅允许以编程方式关闭它)。

答案 2 :(得分:1)

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

你可以:

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

答案 3 :(得分:1)

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

controlPanel.Enabled = false;

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

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

答案 4 :(得分:0)

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

这可能不是最有效的,因为所有KeyPress和Clicks都将通过Filter检查。