【问题标题】:Invoking UI delegate causes UI to be hidden调用 UI 委托会导致 UI 被隐藏
【发布时间】:2009-10-25 05:48:17
【问题描述】:

假设我有线程 1,主窗口 UI 线程和线程 2,一个模式形式的登录 UI 线程。

现在线程 1 执行一段代码并想要更改登录表单中的 UI 元素,因此它调用委托来更改线程 2 中的某些内容。但是当它这样做时,登录表单隐藏在主窗口后面,并且我没有办法把它带回来。在任务栏上选择它不会做任何事情,在调用方法的末尾写“Activate()”也不会做任何事情。

如何防止线程 2 的 UI 被隐藏?

谢谢

【问题讨论】:

  • 另外,当只有一个线程时,在登录表单上使用 ShowDialog 会阻塞主窗口,并强制登录表单在前面。如果我有 2 个线程并且我可以在登录表单仍然打开时关闭主窗口,这将不再适用。我可以复制具有 2 个线程的单线程应用程序的行为吗?
  • 你想要“阻塞”(模态)行为吗?也许你可以在登录表单中创建第二个线程,使用 BackgroundWorker 或类似的东西。禁用登录对话框上的所有控件,执行您需要的任何异步任务(登录?)然后当 BackgroundWorker 完成时解锁登录表单并说“抱歉,再试一次”,或者如果成功,表单将关闭并让您进入到主应用程序。
  • 如果我这样做了,那么登录 UI 将与主 UI 相同,对吧?假设我需要独立的 UI 线程但依赖于 UI 行为。即,无论表格1 有多忙,我都希望表格2 绘制,但我不希望任务栏上有2 个图标。我也不希望在没有另一种形式的情况下显示一种形式。这可能在单独的线程上吗?
  • 如果表格 1 可能“忙”,您的模式似乎很糟糕。在同一个线程中显示所有表单并使用工作线程执行任何异步操作是一种很好的做法。与其为表单 2 创建一个单独的线程,您能否为表单 1 正在执行的工作创建单独的线程,然后立即为表单 2 的 ShowDialog()?您可以通过将 Form.ShowInTaskbar 设置为 false 来阻止表单 2 在任务栏中显示。
  • 好的,我现在看到约定了。我会试试的。只是如果我在不同的线程中执行所有操作,我必须在任何地方都使用 Invoke()。

标签: .net multithreading user-interface delegates invoke


【解决方案1】:

调用更新主窗口后,请在登录表单上调用Focus()。当您显示它时,将登录表单的父窗口设置为主窗口也可能会有所帮助。

(在您的主 UI 类中)

using (YourLoginForm f = new YourLoginForm()){

    YourLoginForm.Show(this)
}

另一种方法可能是使用ShowDialog() 而不是Show(),并让您的登录表单返回不同的DialogResult,具体取决于登录是否成功。 ShowDialog() 应该自动将您的登录表单设置为模态并具有焦点。

【讨论】:

    【解决方案2】:

    哇....自我pwn。 k,消失的第二个窗口的事情是非问题的

    但评论中的问题仍然存在...... 当我在第二个线程中执行 ShowDialog 时,如何防止新窗口与主窗口分开运行?即我不希望用户在第二个窗口后面时最小化主窗口。如果另一个程序出现在顶部并隐藏了所有内容,则单击任务栏中的主窗口图标必须调出第二个窗口,等等

    【讨论】:

    • 不要为自己的问题添加答案,除非它实际上是一个答案。澄清信息应作为评论添加或编辑到您的原始问题中。
    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多