2009-11-16 78 views
0

這聽起來像是一個簡單的任務,但我遇到了一些問題。從MDI切換到SDI並再次返回

我有一些非常簡單的代碼爲我的C#應用​​程序:

private void SwitchToSdi() 
    { 
     MainWindow mainWindow = GetMainWindow(); 

     for (int index = mainWindow.MdiChildren.Length - 1; index >= 0; index--) 
     { 
      Form form = mainWindow.MdiChildren[index]; 
      if (!(form is MainWindow)) 
      {      
       form.Visible = false; 
       form.MdiParent = null; 
       form.Visible = true; 
       mainWindow.MdiChildren[index] = null; 
      } 
     } 
     mainWindow.IsMdiContainer = false; 
    } 

然後,

private void SwitchToMdi() 
    { 
     MainWindow mainWindow = GetMainWindow(); 
     mainWindow.IsMdiContainer = true; 
     for (int index = Application.OpenForms.Count - 1; index >= 0; index--) 
     { 
      Form form = Application.OpenForms[index]; 
      if (!(form is MainWindow)) 
      { 
       form.Visible = false; 
       form.MdiParent = mainWindow; 
       form.Visible = true; 
      } 
     } 
    } 

注意,主窗口是一個MDI父窗口,其IsMdiContainer屬性設置爲True。

用戶可以在選項對話框中切換MDI和SDI。這很好用。如果我切換到SDI,新的窗口在主窗口外面打開,這非常棒。同樣,如果我切換到MDI,它們在容器內部打開。

但是,我注意到了一些事情。

  1. 打開MDI子窗口不會像我預期的那樣變成SDI窗口。

  2. 打開SDI窗口不會像我預期的那樣變成MDI子窗口。

  3. 即使我在調用SwitchToMdi()時將IsMdiContainer設置爲true,如果我嘗試打開一個新窗口,我得到一個異常告訴我主窗口不是MDI容器。 o_O

有人請把我丟在這裏。這不應該是火箭科學。但我沒有在Intarwebs上找到很多有用的幫助(閱讀:g00gle是相當無用的)。

有沒有人在.NET中實現過這種行爲?你是怎麼做到的?我在這裏錯過了什麼? HALP!

回答

1

不得不說,我以前沒有這樣做,只是遇到了同樣的問題。爲了提供解決方案,我目前的想法是,您可以通過「複製」表單狀態來模擬所需的行爲。創建一個新實例並將該狀態傳遞給構造函數。

0

這裏是一個跛腳的答案,但你已經走了18小時沒有之一,所以這裏去...

在Borland/Embarcadero的C++ Builder幫助,它說:「這是不可取的改變FormStyle [在SDI和MDI之間]在運行時「。

+0

哈哈 - 你說得對。這是一個蹩腳的答案。 :0)但這是順利。對於這種特殊的*類型的應用程序,有時候MDI非常有用,並且MDI突破時非常有用(想到多個監視器設置)。想想一下數據庫瀏覽器。 – 2009-11-18 16:07:33

+0

出於好奇,我想知道*爲什麼*這是不可取的。是因爲用戶無法處理它,還是因爲工具/操作系統/某些問題?如果是用戶問題,我不認爲這會是一個問題。我的目標受衆不會是那些不知道如何在MDI和SDI之間進行交換的用戶。 – 2009-11-18 16:09:23

+0

@Mike - 我挖掘了很多,試圖找出爲什麼這是不可取的,因爲我有一個MDI窗口的問題。雖然我從來沒有找到一個體面的答案。同時,我的問題是因爲與MDI完全沒有關係的愚蠢的遺漏。 – 2009-11-19 22:09:28

相關問題