2014-09-26 64 views
0

我有一个应用程序通过显示一个消息框(MessageBox.Show)来响应外部事件(在应用程序外部生成)。它将所有者设置为我的应用程序的主窗口。具有相同所有者的多个消息框

如果第二个事件在第一个模式被解除之前进入,我最终会得到两个消息框。当我在第二个模型之前解雇第一个模型消息箱时,问题就出现了。在这种情况下,第二个盒子保持可见状态,但它已经失去了“模态” - 我可以操作应用程序,就好像这个第二个模式窗口不在那里一样。

我试过的一个解决方案是从MessageBox.Show调用中删除owner参数。根据these docs:“默认情况下,消息框出现在当前活动窗口的前面。”我想通过不指定所有者,“活动”窗口将是所有者。如果没有模态,则主窗口处于活动状态。如果已经有一个模式已经被激活,并且作为所有者,则消息框将被“堆叠”,并且我将无法将其排除在外。

不幸的是,这没有奏效。没有一个模式拥有一个所有者 - 即使第一个消息箱不是模态的,也没有阻止主窗口。

我认为保存每个消息框的窗口,并将其用作下一个窗口的所有者,但后来我意识到没有直接的方法来获取消息窗口的窗口句柄 - Show()方法生成窗口,在盒子被解雇之前不会返回。

我的问题分两部分:这是从messageboxes预期的行为?而且,为了避免在应用程序中打开非模态消息框,我可以做些什么?

+1

模态消息框似乎不是在这种情况下使用的正确UI元素。如果消息以相当连续但不可预知的方式传递给系统,最好将它们显示在其中一个表单的列表中。应用程序中的一种“通知中心”。 – David 2014-09-26 14:41:00

+0

@大卫 - 总的来说,我同意,但在这种情况下,他们是确认对话不只是信息。该请求可以被拒绝/取消。可能仍然需要更好的用户界面。 – 2014-09-26 14:42:31

回答

1

一个解决方案是将外部事件放入队列中,并且一次只显示一个MessageBox。当关闭时,处理队列中的下一个事件(如果存在)。这样,一次只显示一个,所以一个MessageBox不能被另一个拥有,并且它们应该分别由在显示时应用程序窗口处于活动状态的任何应用程序窗口拥有。而且,因为您正在使用队列,所以它们将以接收基础事件的顺序显示。

相关问题