【问题标题】:Why the main form disappears?为什么主窗体消失了?
【发布时间】:2013-05-22 12:58:05
【问题描述】:

在表单上,​​通过单击按钮启动长时间运行的任务。该任务在单独的工作线程上运行,并且在任务运行时我会显示另一个带有进度条的表单。

当任务完成或被取消时,显示进度条的表单将关闭。虚拟代码可能如下所示:

task.DoWorkAsync();
progressBar.Show(parent);

当任务完成时

progressBar.Close();

但有时恰好在显示进度条的窗体关闭的那一刻,主窗体进入后台。更准确地说,我必须做些什么来重现这个问题:

  • 启动我的应用程序
  • 单击另一个窗口(另一个应用程序的,比如 Excel)将其置于最前面
  • 单击我的应用程序窗口(将其置于前面)
  • 运行任务

现在进度条关闭后,我的应用程序窗口消失在我之前带到前面的另一个窗口(这里是 Excel)之后。

当然,我上面描述的只是我的应用程序的粗略轮廓。但是我需要找出为什么我的表单在进度条关闭时消失在表单后面。

【问题讨论】:

  • 奇怪了,主窗体的线程还能活吗?
  • 您正在做某事使主窗口无法访问。您忘记提及了,但这会导致问题。
  • 嗨,Hans 和 Fuex,是的,正确的。我忘了提那个。主 UI 线程保持活动状态,并且主窗口被禁用以使其无法访问。我会尽量不禁用它,看看会发生什么。
  • 更新:汉斯,非常感谢!这就是解决方案!如果不禁用主窗口,效果就消失了。看起来我们要做很多工作!

标签: c# .net winforms


【解决方案1】:

主窗体

ProgressBar progress = new ProgressBar(this);
progress.Show();
this.Hide();

进度条

parent.Show();
progress.Hide();

或者,您可以使用ShowDialog(),这将使主窗体保持打开状态,但在进度条窗体关闭之前无法访问。

【讨论】:

  • 主 UI 线程继续处理其他消息,因此不能在此处阻塞。我知道这不好,但它是在 5 年前实施的,目前很难清理。
【解决方案2】:

如果我理解正确,当您关闭显示进度条的Form 时,主Form 会进入后台?

如果是这样,您可能需要在显示进度条表单后将焦点返回给主表单,因为它偷走了焦点。

这是一个关于表单焦点的堆栈溢出问题:

Form lost focus - Basic Question

【讨论】:

  • 谢谢,但我的感觉是,经常设置表单 TopMost=true 会使事情变得更糟。
猜你喜欢
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-30
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
相关资源
最近更新 更多