我有一个表单,其中有一个按钮副本以及其他控件。当用户按下复制按钮时,后台辅助角色将执行复制操作。
在复制操作期间,我禁用了控件并在完成后重新启用它们。 无论如何,我可以以更简单的方式做到这一点。 如禁用和启用所有键盘/鼠标输入。
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
这应确保透明标签获得焦点并禁用对其他控件的输入。