执行后台操作时禁用 GUI



我有一个表单,其中有一个按钮副本以及其他控件。当用户按下复制按钮时,后台辅助角色将执行复制操作。

在复制操作期间,我禁用了控件并在完成后重新启用它们。 无论如何,我可以以更简单的方式做到这一点。 如禁用和启用所有键盘/鼠标输入。

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

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

//Lock the form
this.Enabled = false;

应该这样做吗?如果这不是您想要的,请原谅。

编辑:

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

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

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 

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

最新更新