2012-06-06 68 views
-1

我正在用C#WPF .NET3.5開發UI程序。在我的主窗口中,我有一個按鈕。當用戶點擊這個按鈕時,它會創建一個無模式的對話框。將焦點改回主窗口並再次點擊該按鈕會創建另一個無模式對話框。對話框的序列如下:從一個父對話框創建多個無模式對話框

米 - > C1 - > C2 - > C3

其中M是主窗口中,C1,C2和C3都在順序子窗口。 C1是非模態的(使用Owner屬性未設置的Window.Show()方法創建),C2和C3是模態的(使用擁有Owner屬性集的Window.ShowDialog()方法創建)。我期望的是,用戶應該能夠從M創建多個C1,C2和C3對話框。

我的問題如下。如果我創建2個C1對話框,一切正常。我可以在M和兩個C1對話框中執行所有UI操作。但是,一旦從一個C1對話框創建C2和C3對話框,我就不能在另一個C1對話框和M對話框中執行任何UI操作。然而,我可以在C3對話框中執行UI操作。

C2對話框包含使用DispatcherTimer更新的進度條。完成操作後,從DispatcherTimer的事件處理程序啓動C3對話框。

我提前感謝您的寶貴支持。

+0

查看Windows.ShowDialog()的定義「打開一個窗口並僅在新打開的窗口關閉時返回」。 – Paparazzi

+0

是的。 ShowDialog()阻止調用函數。這會阻止C1的事件處理程序。但它不會阻止M.的任何事件處理程序。但我無法在M中執行任何UI操作。無論如何,這可能是默認行爲。 Jon下面的答案給出了導致問題的原因的解釋。感謝您的評論。 – geekowl

+0

但根據你的問題,它阻止了M.它說「阻止呼叫」在哪裏?它說「僅返回」。 – Paparazzi

回答

0

您需要找到另一種方法來設置C2和C3始終位於頂部,而不是使用模態對話框。

MSDN

模式窗體或對話框必須關閉或隱藏,然後才能 繼續與應用程序的其它部分的工作。

嘗試C2和C3的TopMost屬性設置爲true,並使用Window.Show()代替Window.ShowDialog()

+0

非常感謝您的回覆。我現在知道爲什麼我不能在除C3以外的所有對話框上執行UI操作。我將使C2和C3無模式,並使用不同的方法將一個對話框放在另一個對話框上。我會讓你知道它是如何工作的。 – geekowl

+0

使窗口最頂層將使其在所有其他窗口之上。我需要一個稍微不同的設計。假設用戶從C1對話框中的一個打開M,2個C1對話框和一個C2和一個C3對話框。當用戶點擊父C1對話框時,C3應該顯示在頂部。如果用戶點擊M,M應該顯示在最上面。如果用戶點擊其他C1對話框,該對話框應該顯示在最上面。當用戶選擇一個窗口時是否會產生一個事件,即將窗口置頂?有了這個事件,我可以使用Activate()函數將適當的窗口帶到上面。 – geekowl

相關問題