C# 执行后台操作时禁用GUI

C# 执行后台操作时禁用GUI,c#,winforms,C#,Winforms,我有一个表单,其中有一个按钮副本和其他控件。当用户按下复制按钮时,后台工作人员执行复制操作 在复制操作期间,我禁用控件,并在完成后重新启用它们。不管怎样,我可以用一种更简单的方式来做。如禁用和启用所有键盘/鼠标输入 PS:如果用户在显示小时窗图标时单击,则不应收集所有这些单击并在GUI空闲时激发它们。当GUI空闲时,它应该删除所有累积的点击 若要禁用所有控件,可以创建新窗体,该窗体将在后台进程运行时处于活动状态。例如,您可以使用此表单显示进度。如果要禁用所有控件,可以创建新表单,该表单将在后台进

我有一个表单,其中有一个按钮副本和其他控件。当用户按下复制按钮时,后台工作人员执行复制操作

在复制操作期间,我禁用控件,并在完成后重新启用它们。不管怎样,我可以用一种更简单的方式来做。如禁用和启用所有键盘/鼠标输入


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

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

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

在开始时将表单
启用
设置为false,处理后台工作人员的完成事件,然后重新启用表单

//Lock the form
this.Enabled = false;
应该这样做吗?对不起,如果这不是你要找的

编辑:


如果您正在寻找一种更奇特的方法来实现这一点,您可以从这里这样的地方获得一个动画.GIF加载程序,然后创建一个带有图片框的
表单
,没有透明背景的边框。然后使用其中的GIF,在开始时调用
ShowDialog
,并在处理结束时关闭对话框,这将显示一个类似于您所看到的常用加载程序的加载程序,并锁定父级
表单。

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

//Lock the form
this.Enabled = false;
应该这样做吗?对不起,如果这不是你要找的

编辑:


如果您正在寻找一种更奇特的方法来实现这一点,您可以从这里这样的地方获得一个动画.GIF加载程序,然后创建一个带有图片框的
表单
,没有透明背景的边框。然后在那里使用GIF,并在开始时调用
ShowDialog
,在处理结束时关闭对话框,这将显示一个类似于您所看到的常用加载程序的加载程序,并锁定
父窗体。

表单
类也具有
已启用的属性

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

编辑:

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

//Lock the form
this.Enabled = false;
大概是这样的:

// 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 

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

表单
类还具有
Enabled
属性

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

编辑:

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

//Lock the form
this.Enabled = false;
大概是这样的:

// 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 

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

This.Enabled=false;会把我不想要的整个表格变成灰色。我只想显示计时器并禁用所有鼠标/键盘输入。@AkshayJ很抱歉,不清楚您是否不想这样做,那么我关于.GIF加载表单的第二条评论对您有用吗?此web应用程序是否可以使用ajax?@CuongLe否问题中的标记是winforms,ajaxload链接基本上只是为了获得合适的.GIF加载图像,与AJAX没有任何关系,因为它可能会让人感到困惑;会把我不想要的整个表格变成灰色。我只想显示计时器并禁用所有鼠标/键盘输入。@AkshayJ很抱歉,不清楚您是否不想这样做,那么我关于.GIF加载表单的第二条评论对您有用吗?此web应用程序是否可以使用ajax?@CuongLe否问题中的标记是winforms,ajaxload链接基本上只是为了获得合适的.GIF加载图像,与AJAX没有任何关系,因为它可能会让人感到困惑;会把我不想要的整个表格变成灰色。我只想显示计时器并禁用所有鼠标/键盘输入。是的,它将“灰显”整个窗体。但这正是应用程序的用户对Windows应用程序的期望,因此也是应用程序应该做的!有一个软件CCleaner,当它删除垃圾的时候,同样的事情发生在我需要的地方,它是一个非常著名的应用程序。我不知道他们是如何做到的,因此发布了这个问题。this.Enabled=false;会把我不想要的整个表格变成灰色。我只想显示计时器并禁用所有鼠标/键盘输入。是的,它将“灰显”整个窗体。但这正是应用程序的用户对Windows应用程序的期望,因此也是应用程序应该做的!有一个软件CCleaner,当它删除垃圾的时候,同样的事情发生在我需要的地方,它是一个非常著名的应用程序。我不知道他们是怎么做到的,所以就把这个问题贴出来了。