创建Tab风格的mdi窗体

网上存在一些tab风格的mdi窗体的控件可能,但是我的需求比较简单,也没有找到合适易用的控件,由于我只需要实现基本的tab页面,以及动态的添加和删除即可,不需要可以将mdi拖动和还原的功能,所以采用winfrom自带的tabcontrol实现。

访问我的个人网站获取更多文章

  1. 第一步:设置主窗体为mid容器,设置主窗体的IsMdiContrainer为True

  2. 第二步:主窗体添加一个tabcontrol,不需要保留tabpage

  3. 第三步:当需要响应添加新的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的通用处理方式

  4. 第四步 处理新增事件。
    注意,我们希望同一个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;
                }
            }
  5. 第五步:响应删除事件。
    由于在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); //移除标签页
            }

    这里写图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章