上一篇文章中提到了可停靠控件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