2013-08-26 113 views
1

我有裏面很多像控制按鈕,圖片,標籤,下拉etc.I已經取得了MDI窗體我點擊一個表單屬性=的IsMdiContainer true.When按鈕裏面的表格另一種形式是在父窗口內打開。現在它的開放,但不幸的是其開放後面的所有控件。如何使子窗體在主窗體的所有控件的前面開放?子窗體的主窗體控件後面開在C#

Form2 childForm = new Form2();    
    childForm.MdiParent = this; 
    childForm.Activate();   
    childForm.Show(); 
+0

你問什麼,據我所知,是不是可能並且可行。雖然可以將控件放在MDI容器上,但主要是可以使用工具欄和狀態欄。 MDIChildren總是出現在表格的主要元素下。 – Adrian

+0

如果OP選擇去與該問題的答案所描述的方法,我建議使用Form.Closing事件通知家長形成孩子正在關閉,因此它可以,如果它打算讓菜單面板評估出現或消失,而不是在一個定時器上浪費CPU週期,當100個循環中有99個循環時,它不會執行任何操作。 – Adrian

+0

@阿德里安這個問題的接受答案不一定是我想要的答案。在這個問題的其他答案和鏈接中還有其他好主意。其中之一應該爲OP –

回答

2

通常我們任何子控件添加到Mdi Form。當Form用作Mdi Form,它應該包含唯一的孩子是MdiClient。那MdiClient將包含您的child forms。所有的控件應該放在Child forms上。但是,如果您需要,我們仍然可以使其工作

Mdi Form中包含默認MdiClient。我們可以在Mdi FormControls集合中找到它。它是MdiClient的類型。這將通過您的Mdi Form的所有其他控件被覆蓋,這就是爲什麼你Child forms不能在上面默認情況下帶來的。爲了解決這個問題,我們只需要訪問MdiClient並撥打電話BringToFont(),並且只要沒有任何Child formVisible,我們將調用SendToBack()MdiClient來顯示您的其他控件(按鈕,圖像,標籤,下拉等) 。這裏是你的測試代碼:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     IsMdiContainer = true; 
     //Find the MdiClient and hold it by a variable 
     client = Controls.OfType<MdiClient>().First(); 
     //This will check whenever client gets focused and there aren't any 
     //child forms opened, Send the client to back so that the other controls can be shown back. 
     client.GotFocus += (s, e) => { 
      if (!MdiChildren.Any(x => x.Visible)) client.SendToBack(); 
     }; 
    } 
    MdiClient client; 
    //This is used to show a child form 
    //Note that we have to call client.BringToFront(); 
    private void ShowForm(Form childForm) 
    { 
     client.BringToFront();//This will make your child form shown on top. 
     childForm.Show();    
    } 
    //button1 is a button on your Form1 (Mdi container) 
    //clicking it to show a child form and see it in action 
    private void button1_Click(object sender, EventArgs e) 
    { 
     Form2 f = new Form2 { MdiParent = this }; 
     ShowForm(f);   
    }  
} 
+0

好的解決方案,有一點需要注意:如果用戶的形式最大限度地減少關閉它,而不是,拉姆達'GotFocus'事件處理函數不是解僱,所以'MdiClient'不會去背一次。現在這不一定是壞事,因爲如果這樣做,你將無法看到最小化的形式,但它是需要注意的事情。 – Adrian

+0

@Adrian當子窗體被最小化時,'MdiClient'應該仍然在最上面,只有當所有的子窗體被隱藏/關閉時它纔會被髮回。這是設計。正如我所說, –

+0

,不一定是壞事。我只是從不完全熟悉MDI如何工作以及他們對使用的期望是什麼的人的角度來思考它。 – Adrian

-1

處理Shown事件並致電this.BringToFront();

+0

這仍然不會在MDIContainer上指定的控件前面顯示子窗體。問題在於控件浮動在面板的前面,形成顯示MDIChild窗體的MDIContainer區域。 – Adrian