DockPanel的基本使用

DockPanel的基本使用 我就不說了,網上不少,我想說的是在使用DockPanel時 須要注意的幾個小問題ide

第一個:函數

使用過DockPanel的人,都有可能會遇到這樣一個錯誤:this

Invalid Content: ActiveContent must be one of the visible contents, or null if there is no visible content.翻譯

翻譯過來的意思大體是:無效的內容: 若是沒有一個可見的內容,ActiveContent必須是可見的內容或空。調試

具體是什麼緣由,你們能夠相互探討下。下面我說說出現這個問題的幾種狀況orm

 代碼中的this關鍵字表明的就是Dockpanel所在的窗體爲Form1對象

1)、當Dockpanel的DocumentStyle不爲DockingMdi時,如下代碼會出現這個問題      blog

       Frm_A frmA = null;
       //判斷子窗體中是否已經存在在DockPanel中
       foreach (DockContent frm in this.dockPanel1.Contents)
        {
             if (frm is Frm_A)
              {
                    frm.Activate();     //激活子窗體
                    return;
              }
            }繼承

 

            frmA = new Frm_A();
            frmA.MdiParent = this;
            frmA.Show(this.dockPanel1);開發

        解決方案:看你設置Dockpanel的DocumnetStyle是否爲DockingMdi。你們也能夠試試其餘幾種方式(DockingWindow,DockingSdi,SystemMdi)

2)、設置了Dockpanel的DocumentStyle不爲DockingMdi時,若是你想要設置窗體Frm_B爲左邊浮動窗體,須要設置窗體Frm_B的DockAreas爲且僅爲DockLeft,若是想要實現其餘功能可自行去設置其餘屬性信息,如今請看下面代碼

            Frm_B frmB = null;
            //判斷子窗體中是否已經存在在DockPanel中
            foreach (DockContent frm in this.dockPanel1.Contents)
            {
                if (frm is Frm_B)
                {
                    frm.Activate();     //激活子窗體
                    return;
                }
            }

            frmB = new Frm_B();
            //frmB.MdiParent = this;
            frmB.Show(this.dockPanel1,DockState.DockLeft);

            注意,若是你在你的代碼中加了紅色註釋的代碼,那麼程序運行時 也會報上面的那個錯

            解決方案:註釋紅色的代碼。

            緣由:(我的理解)frmB.Show(this.dockPanel1,DockState.DockLeft);這句代碼其實就設置了frmB只停靠在DockPanel左邊,此時的frmB是不屬於MDI子窗體的,因此一旦你加入紅色的代碼,程序就會報錯。

 

第二個:

拖動、停靠、固定子窗體(顯示在Dockpanel中)

拖動:若是你想使你的子窗體能夠任意拖動,那麼你在設置子窗體的DockAreas屬性時,保持默認值,不要修改。

停靠:首先你需設置DockAreas的位置,能夠停靠在左、右、下等,也能夠經過程序代碼控制,參考上面代碼。

固定:只需設置你窗體的DockAreas爲Document就好了

 

第三個:

子窗體和Contents的判斷

不少時候你須要判斷Dockpanel中存在多少個子窗體或Contents,請參考下面代碼:

foreach(Form in this.MdiChildren)

{

      //這樣判斷時,停靠的窗體是不會計算在內的

}

 

foreach (DockContent frm in this.dockPanel1.Contents)
 {

     //這樣設置後,全部的繼承與DockContent的窗體都會被計算在內的

}

 

第四個:

尋找主窗體、動態顯示子窗體

參考圖:

實現的功能:這裏咱們須要實現,右鍵點擊A窗體,經過右鍵菜單來顯示窗體B。

  //主窗體的對象
  Form1 form1;

private void showB_Click(object senders, EventArgs e)
 {

           GetFrmMain();  //經過此函數來獲取form1     

           foreach (Form frm in form1.MdiChildren)
            {
                if (frm is Frm_B)
                {
                    frm.Activate();
                    return;
                }
            }

            Frm_B frmB = new Frm_B(this);
            frmB.MdiParent = form1;
            frmB.Show(form1.dockPanel1);

}

 

private void GetFrmMain()

{

              if (this.Parent.Parent.Parent.Parent != null)
                {
                    form1 = (Form1)this.Parent.Parent.Parent.Parent;
                }
                else
                {
                    form1 = (Form1)this.Parent.Parent.Parent;
                }

}

 

如今是在A窗體中,this關鍵字已經代碼的不是主窗體了,那麼這裏咱們就須要獲取主窗體對象

當A窗體停靠時,須要this.Parent.Parent.Parent.Parent(四個)

不停靠時,只須要三個this.Parent.Parent.Parent

調試代碼發現:停靠時

this.Parent 爲 {WeifenLuo.WinFormsUI.Docking.DockPane}

this.Parent.Parent 爲 {WeifenLuo.WinFormsUI.Docking.DockWindow, BorderStyle: System.Windows.Forms.BorderStyle.None}

this.Parent.Parent.Parent 爲 {WeifenLuo.WinFormsUI.Docking.DockPanel, BorderStyle: System.Windows.Forms.BorderStyle.None}

this.Parent.Parent.Parent 爲 {TestEvenhandler.Form1, Text: Form1} 就是咱們要找的主窗體Form1

 

不停靠時:

this.Parent 爲 {WeifenLuo.WinFormsUI.Docking.DockPane}

this.Parent.Parent 爲 {WeifenLuo.WinFormsUI.Docking.DockPanel+AutoHideWindowControl, BorderStyle: System.Windows.Forms.BorderStyle.None}

this.Parent.Parent.Parent 爲 {TestEvenhandler.Form1, Text: Form1} 就是咱們要找的主窗體Form1

 

四個小問題,也算不上技巧,是我在開發中遇到過的,裏面的原因可能解釋不是很清楚,忘你們相互探討,共同進步。

相關文章
相關標籤/搜索