【发布时间】:2012-10-10 16:38:00
【问题描述】:
我有一个表单,其中有一个按钮复制以及其他控件。当用户按下复制按钮时,BackgroundWorker 会执行复制操作。
在复制操作期间,我将禁用控件并在完成后重新启用它们。无论如何我可以用更简单的方式做到这一点。就像禁用和启用所有键盘/鼠标输入一样。
PS:如果用户在显示 Hour-Glass 图标时点击,它不应该收集所有这些点击并在 GUI 空闲时触发它们。当 GUI 得到释放时,它应该删除所有累积的点击。
【问题讨论】:
我有一个表单,其中有一个按钮复制以及其他控件。当用户按下复制按钮时,BackgroundWorker 会执行复制操作。
在复制操作期间,我将禁用控件并在完成后重新启用它们。无论如何我可以用更简单的方式做到这一点。就像禁用和启用所有键盘/鼠标输入一样。
PS:如果用户在显示 Hour-Glass 图标时点击,它不应该收集所有这些点击并在 GUI 空闲时触发它们。当 GUI 得到释放时,它应该删除所有累积的点击。
【问题讨论】:
一开始设置表单Enable为false,处理后台worker的完成事件,重新启用表单。
//Lock the form
this.Enabled = false;
应该这样做吗?对不起,如果这不是您要找的。p>
编辑:
如果您正在寻找一种更好的方式来实现这一点,您可以从类似这里的某个地方获取一个动画 .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
这应该确保透明标签获得焦点并禁用对其他控件的输入。
【讨论】: