网上存在一些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); //移除标签页 }