【问题标题】:C# dynamic label blankC#动态标签空白
【发布时间】:2013-05-17 16:15:33
【问题描述】:

我创建了一个非常基本的控制台应用程序,它在后台执行一些代码。在执行此操作时,它会生成一个自定义消息框(从技术上讲,它是一个 Windows 窗体),它只显示一个标签,告诉用户请稍候。问题是标签永远不会显示(它只是一个大白框,标签应该在哪里)。我尝试创建一个动态标签并将其放在那里,但这也不起作用。

表格显示方式如下:

public void DoSomething()
{
   MyForm form = new MyForm();
   form.Show();
   try {
   // Execute other logic
   } finally { form.Close(); }
}

我猜这与调用 Show() 有关,但我并不肯定。我输入日志,看到它正在通过构造函数,生成动态标签(通过 Controls.Add(myLabel) 添加到表单中),但它仍然没有显示任何标签。

【问题讨论】:

  • 发生这种情况时您是否阻塞了 UI 线程?这是我的猜测。
  • 我可以问一下你的MyForm类是什么样的吗?
  • @JonSkeet 他在控制台应用程序中执行此操作 - 我认为没有“UI 线程”:)
  • @ReedCopsey:我错过了。如果在没有 UI 线程时调用 Show,不确定 会发生什么...
  • @JonSkeet 什么都没有发生(视觉) - 它“发布”消息,但它们从未得到处理。

标签: c#


【解决方案1】:

Form 需要启动消息泵才能正确显示。这需要调用Application.Run。不幸的是,这将阻塞当前线程,直到“应用程序”完成,因此无法直接“插入”到您的代码中。

话虽如此,如果您正在开发一个需要 Windows 的应用程序,您应该考虑将其设为真正的 Windows 应用程序而不是控制台应用程序。如果需要,您可以只隐藏主窗体,这样就可以让上面的代码正常工作。

【讨论】:

  • 它实际上应该是安装不同产品的一部分。我要显示的表单是“请稍候...”消息框,因此它不是真正的 Windows 应用程序
  • @Sean 如果要显示消息,则应将其设为 Windows 应用程序。主窗体可以隐藏并完成所有处理。
  • 在项目的属性中将其设置为 Windows 应用程序(我让控制台不出现的 hacky 方式),您的建议是我只是添加一个不可见的主窗体,以便来自其他表单的消息是否已处理?
  • @Sean 是的 - 如果您想使用非模态窗口,您需要致电 Application.Run,因此该应用程序正在运行消息泵。
  • 我可以在该类中创建一个函数,然后在该类的持续时间内调用 Application.Run 吗?
猜你喜欢
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
  • 2017-09-29
  • 1970-01-01
相关资源
最近更新 更多