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