2014-09-26 62 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不能被另一個擁有,並且它們應該分別由在顯示時應用程序窗口處於活動狀態的任何應用程序窗口擁有。而且,因爲您正在使用隊列,所以它們將以接收基礎事件的順序顯示。

相關問題