执行后台操作时禁用GUI

时间:2012-10-10 08:11:00

标签: c# winforms

我有一个表单,其中有一个Button Copy和其他Controls。当用户按下复制按钮时,BackgroundWorker会执行复制操作。

在复制操作期间,我将禁用控件并在完成时重新启用它们。无论如何,我可以更容易地做到这一点。像禁用和启用所有键盘/鼠标输入。

PS:如果用户在显示Hour-Glass图标时单击,则不应收集所有这些点击并在GUI空闲时触发它们。当GUI获得免费时,它应该删除累积的所有点击。

3 个答案:

答案 0 :(得分:1)

在开始时将表单Enable设置为false,处理后台工作程序的finish事件并重新启用表单。

//Lock the form
this.Enabled = false;

应该这样做吗?对不起,如果这不是你想要的。

编辑:

如果你正在寻找更好的方法,你可以从像这里的某个地方获得一个动画.GIF加载器 - http://ajaxload.info/,然后创建一个带有图片框的form,没有透明的边框背景。然后在那里使用GIF并在开始时调用ShowDialog并在处理结束时关闭对话框,这将显示类似于您常用的加载器并锁定parent表单。 / p>

答案 1 :(得分:0)

如果要禁用所有控件,可以创建在后台进程运行时处于活动状态的新表单。例如,您可以使用此表单来显示进度。

答案 2 :(得分:0)

Form类也具有Enabled属性。

通过禁用Form表单上的每个控件也将被禁用。这可能是禁用整个窗口的最简单方法。

修改

如果你真的只是想要禁用任何输入而不做任何其他事情,尽管这对用户来说是反直觉和困惑的,那么你可以添加一个像标签一样的新控件内容和表单顶部的透明背景。

这样的事情:

// When starting the operation:
var transparentLabel = new Label();
transparentLabel.Bounds = form.Bounds;
// You may have to set the bacground and border and stuff, I am unsure
form.Children.Add(transparentLabel);
// Change cursor to a hourglass as well?


// When the operation is done
form.Children.Remove(transparentLabel);
// Change cursor back 

这应确保透明标签获得焦点并禁用其他控件的输入。