網上存在一些tab風格的mdi窗體的控件可能,但是我的需求比較簡單,也沒有找到合適易用的控件,由於我只需要實現基本的tab頁面,以及動態的添加和刪除即可,不需要可以將mdi拖動和還原的功能,所以採用winfrom自帶的tabcontrol實現。
第一步:設置主窗體爲mid容器,設置主窗體的IsMdiContrainer爲True
第二步:主窗體添加一個tabcontrol,不需要保留tabpage
第三步:當需要響應添加新的tabpage的時候(即新增一個form,且form以tabpage的形式出現),代碼如下
Form form1=new Form ( ); addTab(form1); private void addTab(Form form) { form.MdiParent = this; //設定爲mdi子窗體 form.TopLevel = false; TabPage tb = new TabPage(); tb.Controls.Add(form); //將窗體添加到form中 tb.Text = form.Text; //設定tabpage標籤 tb.Name = form.Name; //設定tabpage的name屬性,爲了之後的新增和銷燬處理 tabControl1.TabPages.Add(tb); form.FormBorderStyle = FormBorderStyle.None; //去除原form自帶的邊框 form.Dock=DockStyle.Fill; //填充整個tabpage form.Show(); }
以上代碼爲新增一個tab的通用處理方式
第四步 處理新增事件。
注意,我們希望同一個tab只有一個,當點擊菜單或者工具欄按鈕實現新增tab的時候,必須檢測是否已存在,實現代碼如下private void DataMangementToolStripMenuItem_Click(object sender, EventArgs e) //響應菜單新增事件 { TabPage tb = tabControl1.TabPages["UiDataMangement"]; //新建一個tabpage if (tb==null)//說明該需要新增的tab不存在 { UiDataMangement dataMange = new UiDataMangement(); addTab(dataMange); tabControl1.SelectedTab = tabControl1.TabPages["UiDataMangement"]; } else { tabControl1.SelectedTab = tb; } }
第五步:響應刪除事件。
由於在tab標籤上添加關閉的x號稍微複雜(需要GDI自己繪製和響應事件),我們可以採用雙擊標籤頁關閉的方式,需要響應tabcontrol的MouseDoubleClick事件刪除的時候,要刪除tabpage,同時要將窗體銷燬掉,代碼如下private void tabControl1_MouseDoubleClick(object sender, MouseEventArgs e) { System.Windows.Forms.Control.ControlCollection coll = tabControl1.SelectedTab.Controls; foreach( Control control in coll) { control.Dispose(); //釋放窗體 } this.tabControl1.TabPages.Remove(tabControl1.SelectedTab); //移除標籤頁 }