我有一個Windows窗體應用程序可以打開MDI子窗體。當我選擇這些表單時,我需要設置或渲染其窗口狀態爲最大化。問題是,當我在打開的窗體之間導航時,它會恢復到正常的窗口狀態,並且當我將窗口狀態再次設置爲最大時,它會顯示從正常狀態到最大化狀態的轉換,並且看起來不太好。有關設置Windows窗體窗口窗口狀態的提示
如何創建具有MDI父窗體的Windows應用程序,以最大化窗口狀態打開許多MDI子窗體?
我有一個Windows窗體應用程序可以打開MDI子窗體。當我選擇這些表單時,我需要設置或渲染其窗口狀態爲最大化。問題是,當我在打開的窗體之間導航時,它會恢復到正常的窗口狀態,並且當我將窗口狀態再次設置爲最大時,它會顯示從正常狀態到最大化狀態的轉換,並且看起來不太好。有關設置Windows窗體窗口窗口狀態的提示
如何創建具有MDI父窗體的Windows應用程序,以最大化窗口狀態打開許多MDI子窗體?
下面是基於使用MDI答案「父窗體和子窗體的範例,」基於以下假定:
你有一個MenuStrip控件「碼頭=‘頂你的MDIParentForm,和你’ How to: Create an MDI Window List with MenuStrip
要創建新的子窗體的是:
一中描述VE實現自動MDI &窗口菜單句柄。沒有MaximizeBox,MinimizeBox等,但可能有ControlBox(用於關閉它們)
b。這些兒童形式可能是可調整的或不可調整的:我們不會考慮這裏的含義。
您希望這些MDIChildForms在MDIParent窗體中顯示爲最大化,但不能遮蔽MDIParentForm的菜單。
好了:假設你有你的所有子窗體完全設計好,「伺機而動」:我們可能會看到一些像這樣的代碼在你的MDIParentForm代碼:
// create instances of your child forms
Form2 f2 = new Form2();
Form3 f3 = new Form3();
Form4 f4 = new Form4();
Form5 f5 = new Form5();
private void MDIParentForm1_Load(object sender, EventArgs e)
{
f2.Text = "subForm1";
f3.Text = "subForm2";
f4.Text = "subForm3";
f5.Text = "subForm4";
f2.MdiParent = this;
f3.MdiParent = this;
f4.MdiParent = this;
f5.MdiParent = this;
f2.Dock = DockStyle.Fill;
f3.Dock = DockStyle.Fill;
f4.Dock = DockStyle.Fill;
f5.Dock = DockStyle.Fill;
f2.Show();
f3.Show();
f4.Show();
f5.Show();
}
在這一點上, dock style'填充應用於子窗體將使它們全屏,並防止遮擋MDIParentForm菜單:菜單將允許您自動選擇哪一個是最前面的。
現在,如果你想做更有趣的東西:比如調整孩子的形狀,平鋪他們,把他們串起來。您將不得不更改這些子窗口的Dock屬性:然後您可以使用內置的MDI範例窗口來安排設施,如下所述:How to: Arrange MDI Child Forms
如果要創建多個實例一種預定義的子窗體:How to Create MDI Child Forms ...查看關於如何使用「新菜單項」的示例:可能證明有用。
如果您希望窗口狀態始終最大化,我建議從MDI窗體切換。在這種情況下,TabControl可能會更好。
MDI表單有很多可用性問題,這就是爲什麼它們不再常用,並且傾向於被其他控件/選項所取代。
tabcontrol的問題是,我有很多每個子窗體使用的控件。 –
這是一個問題,因爲...?您可以將這些放入UserControl中,並將每個UserControl放置在一個選項卡中。您甚至可以在顯示選項卡時按需創建它們,並且它將具有與MDI表單相同(或更低)的開銷。 –
閱讀蘆葦答案,尤其是你的意見後:
問題TabControl的是,我有一個 很多每個孩子形式
使用的控制也許這將幫助: 不要將您的控件放入Winform
。而是將它們封裝到UserControl
(也許它已經通過將您的繼承從Form
更改爲UserControl
)工作。
現在將每個UserControl放在它自己的TabPage上並將其Dock屬性設置爲Fill。現在,您可以自行更改每個用戶控件,而不會干擾另一個TabPage上的另一個控件(只要您不在任何連接中)。
表單也可以在TabPages中使用,沒有任何問題(您可能需要關閉不需要的Form可視元素):但是,由於UserControls的「更輕」,也許這是實現它的最佳方式。一旦UserControl(或Form)被添加到TabPage的Controls集合中,您只能訪問頂層屬性:如果更改「源」UserControl或Form:則需要重新構建項目(不是什麼大問題)。我的習慣是在「主窗體」的Form Load事件代碼中填充TabPages(如果它們只用於保存UserControl),但這只是個人偏好。 – BillW
如果你打算放棄MDI,你可以看看對接框架,如WeifenLuo或DigitalRune。這些都是免費的,其他的選擇,你可以看看這裏:http://windowsclient.net/downloads/folders/controlgallery/tags/Windows+Forms+Docking+Windows/default.aspx
編輯:
如果我記得很清楚,DigitalRune允許的窗口形式容器對接內容,以便遷移的使用努力會更小。
是的,很明顯,但讓我問你:你是否願意使用MDI的替代品,並「放棄」你現在使用的MDI的其他「特徵」?我認爲,如果你確切地說你(或者運行時最終用戶)如何在「開放表單之間導航」:通過MDI Parent表單上的菜單,這也很有價值?要麼 ... ? – BillW
是的。在家長中,有一個菜單可以選擇孩子。我可以使用什麼替代方案?它是tabcontrol? –
因此,在「放棄」MDI「功能」時,對於您最小化「子」表單(設置爲MDIParent表單的表單的MDIParent屬性)的情況,您沒有任何問題,它會下降到父MDI的底部TitleBar可見的形式?您是否正在使用MDI的「自動窗口菜單功能」:http://msdn.microsoft.com/en-us/library/ms171654(VS.100).aspx?如果你把MDI放在後面,沒問題嗎? – BillW