代码之家  ›  专栏  ›  技术社区  ›  Steven A. Lowe

MessageBox的建议。是否显示不阻止GUI线程的替换?

  •  3
  • Steven A. Lowe  · 技术社区  · 17 年前

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

    7 回复  |  直到 17 年前
        1
  •  4
  •   JFV    17 年前

        2
  •  4
  •   OregonGhost    17 年前

    • 如果您只是想要一个通知,您可以尝试一个气球提示(TNA或您自己的),或者一个类似Outlook邮件通知的窗口,或者许多即时通讯工具(如Trillian display)的通知。
    • 如果您只是想给用户一个行动的机会,请使用非模态表单,但请记住,用户可能只需单击它即可。
    • 如果用户必须根据您的消息进行操作,则应转到模态。请注意,所有者窗口仍将被绘制,您可以刷新GUI—毕竟,模式对话框有一个消息泵,否则它将无法工作。我最近做了类似的事情,我们有一个后台工作线程池,可以执行任何操作并触发事件,以便GUI刷新,还有一个模式等待对话框,仍然可以获得消息。所有者窗口按预期使用后台操作进行了更新。
        3
  •  2
  •   Don Kirkby    16 年前

    添加一个 NotifyIcon 添加到应用程序并显示 balloon tip . 缺点是通知会在短时间内消失,但如果用户不需要采取行动,这对他们来说可能是最好的。

        4
  •  1
  •   rslite    17 年前

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

        5
  •  1
  •   Mitchel Sellers    17 年前

    如果您不想让它阻塞,我只需要创建您自己的简单表单来进行显示。这就是我以前在需要非阻塞解决方案时为客户完成项目的方式。但请记住,如果您以非阻塞的方式进行操作,那么如果用户真的是“您必须行动”类型的项目,那么他们可能会得到成倍的增长,并且不知所措。

        6
  •  1
  •   Steven A. Lowe    17 年前

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

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

        7
  •  -1
  •   Maurice    17 年前

    如果您想要MessageBox的外观,只需在后台线程中显示它。

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