对于不阻止GUI线程的MessageBox.Show替换的建议?

时间:2008-10-13 20:12:22

标签: .net user-interface messagebox

一段时间后,我遇到了一个情况,我们需要向用户显示消息框以获取通知,但是我们无法使用MessageBox.Show,因为它阻止了GUI线程(所以当对话框是屏幕时,屏幕上没有任何内容更新活性)。关于替代方案的任何建议?

[我当时编写了一个替代品,但我不喜欢它。如果没有更好的出现,我会发布它作为答案]

编辑:对话框必须浮在主窗口的顶部;我不在乎它是否出现在任务栏中。在某些情况下,可能会同时激活多个对话框。

ADDENDUM:我的解决方案是一个基本表单,它提供了OK和CANCEL按钮来发出已完成和已取消的事件; OK称为子类覆盖的虚拟ValidateData。调用表单使用属性来避免每次重新创建表单(表单只是隐藏而不是关闭)并保留活动表单的字典以防止同一表单被激活多次。这看起来像一个模态形式,一次支持多个弹出窗体,但不会占用主GUI线程。

7 个答案:

答案 0 :(得分:4)

我同意rslite和Mitchel Sellers。创建非模态表单以显示所需信息是最佳途径。如果您有多条消息,您可能需要考虑将它们放入ListBox并让用户双击它们以获取需要显示的完整信息。

答案 1 :(得分:4)

我建议采用非模态方法,就像其他人说的那样,但更具体一点:

  • 如果您只是想要通知,可以尝试使用气球提示(TNA或您自己的),或者像Outlook邮件通知或许多即时信使(如Trillian)显示的通知。
  • 如果您只是想让用户有机会采取行动,请使用非模态表单,但请记住,他可能只需将其点击即可。
  • 如果用户必须对您的消息采取行动,您应该采用模态。请注意,所有者窗口仍然会被绘制,您可以刷新GUI - 毕竟,模式对话框有一个消息泵,否则它将无法工作。我最近做了类似的事情,我们有一个后台工作线程池,可以进行任何操作和触发GUI的刷新事件,还有一个模态等待对话框仍然可以获取消息。所有者窗口确实按预期更新了后台操作。

答案 2 :(得分:2)

如何在您的应用中添加NotifyIcon并显示balloon tip。缺点是通知会在短时间后消失,但如果用户不需要采取行动,这可能是最好的。

答案 3 :(得分:1)

我会通过使用非模态对话框或某些工具提示来解决这个问题,具体取决于具体要求。

答案 4 :(得分:1)

如果您不想阻止它,我只需创建您自己的简单表单来进行显示。这就是我在需要非阻塞解决方案之前为客户完成项目的方法。但请记住,如果你以非阻塞方式进行操作,那么如果用户真的是“你必须采取行动”类型的项目,那么用户可能会倍增并被淹没。

答案 5 :(得分:1)

感谢所有提出建议的人,似乎我的解决方案是正确的; - )

我的解决方案是一个基本表单,它提供OK和CANCEL按钮来发出已完成和已取消的事件; OK称为子类覆盖的虚拟ValidateData。调用表单使用属性来避免每次重新创建表单(表单只是隐藏而不是关闭)并保留活动表单的字典以防止同一表单被激活多次。这看起来像一个模态形式,一次支持多个弹出窗体,但不会占用主GUI线程。

答案 6 :(得分:-1)

如果你想让MessageBox看起来只是在后台线程中显示它。

ThreadPool.QueueUserWorkItem( (state) =>
    {
         MessageBox.Show("Your message");
    });

(代码未经测试)