上一篇文章中提到了可停靠控件DockPanel Suite,下面我簡單介紹下該組件的使用方法。
1.多文檔界面(MDI)
DockPanel Suite的主窗體類似於WinForm中開發MDI應用程序的父窗體,父窗體容納了所有的停靠窗體,停靠窗體類似於MDI中的子窗體。
紅色區域是一個Panel,繼承於WeifenLuo.WinFormsUI.Docking.DockPanel,所有的子窗體必須停靠、懸浮、隱藏在該Panel中。因為是基於MDI的應用,所以父窗體屬性IsMdiContainer必須設置為true。另外,子窗體都繼承於WeifenLuo.WinFormsUI.Docking.DockContent,這樣才能停靠在父窗體中。
2.DockState
DockPanel Suite中的DockSate是一個非常重要的屬性:
public enum DockState
{
Unknown = 0,
/// <summary>
/// 懸浮
/// </summary>
Float = 1,
/// <summary>
/// 頂部窗體自動隱藏
/// </summary>
DockTopAutoHide = 2,
/// <summary>
/// 左停靠窗體自動隱藏
/// </summary>
DockLeftAutoHide = 3,
/// <summary>
/// 底部停靠窗體自動隱藏
/// </summary>
DockBottomAutoHide = 4,
/// <summary>
/// 右停靠窗體自動隱藏
/// </summary>
DockRightAutoHide = 5,
/// <summary>
/// 停靠窗體文檔對象
/// </summary>
Document = 6,
/// <summary>
/// 頂部停靠
/// </summary>
DockTop = 7,
/// <summary>
/// 左停靠
/// </summary>
DockLeft = 8,
/// <summary>
/// 底部停靠
/// </summary>
DockBottom = 9,
/// <summary>
/// 右停靠
/// </summary>
DockRight = 10,
Hidden = 11
}
代碼中的注釋表示的是子窗體停靠父窗體的位置。在繼承於DockContent的子窗體中有一個屬性ShowHint可以初始化子窗體在顯示的時候停靠的方位。
測試效果如下:
DockPanel Suite中提供了一個相應的DockStateChanged來監測子窗體的DockState變化。
3.DockPane及DockAlignment
停靠窗體也可以選擇停靠面板(DockPane)來停靠,停靠面板是一個停靠窗體中內置的面板(pane),該面板是一個UserControl,方法如下:
public void Show(DockPane previousPane, DockAlignment alignment, double proportion)
其中參數DockAlignment枚舉如下:
public enum DockAlignment
{
/// <summary>
/// 相對於停靠面板左
/// </summary>
Left,
/// <summary>
/// 相對於停靠面板右
/// </summary>
Right,
/// <summary>
/// 相對於停靠面板頂部
/// </summary>
Top,
/// <summary>
/// 相對於停靠面板底部
/// </summary>
Bottom
}
參數proportion指的是相對停靠面板的占據位置的百分比:
圖中紅色區域為Form0內置面板區域,該區域下方距離停靠面板百分比為0.4。
4.DockArea
停靠窗體存在一個停靠區域,其屬性為DockArea,與DockState比較相似,為枚舉類型:
[Flags]
[Serializable]
[Editor(typeof(DockAreasEditor), typeof(System.Drawing.Design.UITypeEditor))]
public enum DockAreas
{
Float = 1,
DockLeft = 2,
DockRight = 4,
DockTop = 8,
DockBottom = 16,
Document = 32
}
通常在停靠窗體初始化時可以設置其停靠區域,限制其拖動的區域位置。需要注意的是當DockState為DockLeft |DockRight |DockTop |DockBottom |Float |Document 時,對其相應DockAreas設置的DockLeft |DockRight |DockTop |DockBottom |Float |Document 無效。例如,當DockState為DockRight 時,對DockAreas設置區域DockRight 無效,會拋出異常,在我的測試代碼中作了一個擴展,來避免不必要的異常(異常信息為:Invalid Value: The value of DockAreas conflicts with current DockState):
public static bool IsDockAreaValid(this DockContent dock,DockAreas areas)
{
bool valid = true;
switch (areas)
{
case DockAreas.DockBottom:
valid=(dock.DockState!=DockState.DockBottom);
break;
case DockAreas.DockLeft:
valid=(dock.DockState!=DockState.DockLeft);
break;
case DockAreas.DockRight:
valid = (dock.DockState != DockState.DockRight);
break;
case DockAreas.DockTop:
valid = (dock.DockState != DockState.DockTop);
break;
case DockAreas.Document:
valid = (dock.DockState != DockState.Document);
break;
case DockAreas.Float:
valid = (dock.DockState != DockState.Float);
break;
default:
break;
}
return valid;
}
5.DocumentStyle
可以設置DockPanel容器DocumentStyle來改變停靠窗體的風格,DocumentStyle枚舉類型如下:
public enum DocumentStyle
{
DockingMdi,
DockingWindow,
DockingSdi,
SystemMdi,
}
默認值為DockingMdi,個人覺得這幾種窗體風格的樣式相差無幾。
6.其他
在DockPanel Suite源代碼自帶的實例中,還有一些常用功能如下:
- 關閉激活的停靠窗體、關閉所有停靠窗體
- 停靠狀體的布局保存與加載(代碼與XML兩種方式);可以事先使用代碼構建整個應用程序的界面布局,然后在應用程序退出的時將布局保存到xml,以后就以該xml作為標准的
界面布局文件 - 停靠窗體換膚
- 補充一點,關於DockState為非Document的停靠窗體如果需要設置其右鍵快捷菜單的話可以設置DockContent類中屬性TabPageContextMenuStrip為其自己定義的ContextMenu,
效果如下: 
演示源代碼下載:DockableWindowSample.rar



