創建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); //移除標籤頁
            }

    這裏寫圖片描述

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