2011-11-28 290 views
0

我有一個父窗體設置爲Mdi容器。我從父窗體中的菜單欄中單擊加載名爲Plot的子窗體。該代碼是:C#窗體窗體:Mdi父窗體和子窗體問題

protected void menuPlot_Click(object sender, EventArgs e) 
{ 
    // ... load form with Plot settings in center of parent form 

    // ... create a new instance of the Plot settings child form 
    PlotSettings plotSettings = new PlotSettings(); 

    // ... set Welcome as the parent form for the Plot settings child window 
    plotSettings.MdiParent = this; 

    // ... display and position Plot settings child form 
    plotSettings.StartPosition = FormStartPosition.CenterScreen; // center child form 
    plotSettings.Show(); // display child form 
} 

這種運作良好,除了我有以下問題:

  1. 有沒有什麼辦法可以強制孩子形式留在中央。目前我能夠在容器內拖動它。我想阻止用戶移動它。我現在唯一能想到的就是讓孩子形成無國界的邊界,但我不確定這是否會奏效。

  2. 有什麼辦法可以讓兒童表格模態?是的,我知道我可以製作孩子表格模式,但不會再被包含在父表格中,這正是我想要的。是否有一種方法可以在子窗體處於活動狀態時禁用父控件?目前,我可以打開子窗體的多個實例,但我希望隨時只有一個實例。

  3. 我在父窗體上有一些標籤,標籤總是坐在子窗體的頂部。有沒有辦法強制兒童表格成爲最頂層?我使用TopMost,這似乎不起作用。

感謝您的任何幫助,您可能會提供。

+1

這是三次「否」。你真的似乎不想使用MDI。使用另一個窗口模型,如http://sourceforge.net/projects/dockpanelsuite/ –

+0

謝謝你的鏈接。您可能是對的,但我認爲可能有辦法 – Zeos6

+0

您無法在父窗體上進行任何控制,如果它們可見,它們將始終顯示在子窗體的頂部。看看這個答案,我給了一個simular [問題](http:// stackoverflow。com/a/4130055/479512) –

回答

0

怎麼樣設置ControlBoxMinimizeBoxMaximizeBox爲False,設置WindowStateMaximized

然後,您可以有一個Panel或GroupBox或以最大化的子窗體爲中心的其他視覺元素,以便它始終保持在屏幕的中心,並且用戶無法調整該元素的大小或以其他方式移動它。至於只打開一個實例,這只是忙碌的工作:當你打開表單時,將打開的實例註冊到一個靜態類中;當它關閉時取消註冊。在打開表單之前,檢查一下是否有一個實例在靜態類中註冊;如果是這樣,請將重點放在它上面,如果沒有打開一個新的實例。

+0

將檢查了這一點。謝謝。 – Zeos6

1
  1. 使用子窗體「LocationChanged」事件並將代碼放在窗體的中心。

    this.Left = ((this.ParentForm.ClientRectangle.Width - this.Width)/2); 
    this.Top = ((this.ParentForm.ClientRectangle.Height - this.Height)/2); 
    
  2. 具有以下形式檢查它的只有一個實例的所有腦幹使用:

    if (!this.MdiChildren.Any<Form>(item => item is Form1)) 
    { 
    
    } 
    
  3. 您可以手動重繪MDI窗體窗口上的圖形,但否則我不會把任何控件有。 (您需要重寫OnPaint和OnPaintBackgound。)

+0

實例檢查似乎不適用於我,但我明白了這個概念。我會盡力去玩。謝謝。 – Zeos6