開源組件DockPanel Suite使用


上一篇文章中提到了可停靠控件DockPanel Suite,下面我簡單介紹下該組件的使用方法。

1.多文檔界面(MDI)

DockPanel Suite的主窗體類似於WinForm中開發MDI應用程序的父窗體,父窗體容納了所有的停靠窗體,停靠窗體類似於MDI中的子窗體。

image

紅色區域是一個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可以初始化子窗體在顯示的時候停靠的方位。

測試效果如下:

image

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指的是相對停靠面板的占據位置的百分比:

image

圖中紅色區域為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,

效果如下: image
演示源代碼下載:DockableWindowSample.rar


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM