【问题标题】:Disable GUI when doing background operation进行后台操作时禁用 GUI
【发布时间】:2012-10-10 16:38:00
【问题描述】:

我有一个表单,其中有一个按钮复制以及其他控件。当用户按下复制按钮时,BackgroundWorker 会执行复制操作。

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

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

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    一开始设置表单Enable为false,处理后台worker的完成事件,重新启用表单。

    //Lock the form
    this.Enabled = false;
    

    应该这样做吗?对不起,如果这不是您要找的。​​p>

    编辑:

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

    【讨论】:

    • this.Enabled = false;将使我不想要的整个表格变灰。我只想显示沙漏并禁用所有鼠标/键盘输入。
    • @AkshayJ 抱歉,不清楚您是否不想这样做,我关于 .GIF 加载表单的第二条评论对您有用吗?
    • 这个 Web 应用程序是否可以使用 ajax?
    • 你可以在上面看到标签winforms。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      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 
      

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

      【讨论】:

      • this.Enabled = false;将使我不想要的整个表格变灰。我只想显示沙漏并禁用所有鼠标/键盘输入。
      • 是的,它将“灰显”整个表单。但这正是您的应用程序的用户对 Windows 应用程序的期望,因此这是您的应用程序应该做的!
      • 有一个软件CCleaner,当它删除垃圾时,同样的事情发生在我所需要的并且它是一个非常有名的应用程序。我不确定他们是如何做到的,因此发布了这个问题。
      猜你喜欢
      • 2021-12-03
      • 1970-01-01
      • 2019-05-05
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-31
      相关资源
      最近更新 更多