C#开源控件DocKPanel

来源:互联网 发布:雪梨的淘宝店有哪几个 编辑:程序博客网 时间:2024/06/05 12:07

weiFenLuo.winFormsUI.Docking.dll是开源项目DockPanel Suite的一个类库,可以实现像Visual Studio的窗口停靠、拖拽等功能。

官方下载地址:http://sourceforge.net/projects/dockpanelsuite/


具体操作可参考以下:
1.建立一个WinForm工程,默认生成了一个WinForm窗体Form1。
2.引用—>添加引用—>浏览—>weiFenLuo.winFormsUI.Docking.dll。
3.窗体属性IsMdiContainer:True。
4.工具箱—>右键—>选择项—>.net组件—>浏览—>weiFenLuo.winFormsUI.Docking.dll—>在工具箱出现dockPanel。
5.将dockPanel拖到窗体Form1上,设置Dock属性,我设置的是:Fill。
停靠窗体:

1.新建一个WinForm窗体Form2。
2.在代码中修改窗体继承于DockContent。

注:关键一步
public partial class Form2 : WeifenLuo.WinFormsUI.Docking.DockContent

3.在主窗体Form1中显示停靠窗体。

private void Form1_Load(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.Show(this.dockPanel1);
form2.DockTo(this.dockPanel1, DockStyle.Left);
}

  其中dockPanel1是父窗口中DockPanel的名称。主要用到Show和DockTo方法。DockTo中第二个参数可以更改,你想Dock到什么地方有改成什么。有DockStyle.Left, DockStyle.Right, DockStyle.Top, DockStyle.Bottom, DockStyle.Center.

以下来自http://www.cnblogs.com/ecin/archive/2012/02/14/2350244.html

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是一个非常重要的属性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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,方法如下:

1
public void Show(DockPane previousPane, DockAlignment alignment, double proportion)

其中参数DockAlignment枚举如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public enum DockAlignment
    {
        /// <summary>
        /// 相对于停靠面板左
        /// </summary>
        Left,
        /// <summary>
        /// 相对于停靠面板右
        /// </summary>
        Right,
        /// <summary>
        /// 相对于停靠面板顶部
        /// </summary>
        Top,
        /// <summary>
        /// 相对于停靠面板底部
        /// </summary>
        Bottom
    }

参数proportion指的是相对停靠面板的占据位置的百分比:

image

图中红色区域为Form0内置面板区域,该区域下方距离停靠面板百分比为0.4。

4.DockArea

停靠窗体存在一个停靠区域,其属性为DockArea,与DockState比较相似,为枚举类型:

1
2
3
4
5
6
7
8
9
10
11
12
[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):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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枚举类型如下:

1
2
3
4
5
6
7
public enum DocumentStyle
    {
        DockingMdi,
        DockingWindow,
        DockingSdi,
        SystemMdi,
    }

默认值为DockingMdi,个人觉得这几种窗体风格的样式相差无几。

6.其他

在DockPanel Suite源代码自带的实例中,还有一些常用功能如下:
  • 关闭激活的停靠窗体、关闭所有停靠窗体
  • 停靠状体的布局保存与加载(代码与XML两种方式);可以事先使用代码构建整个应用程序的界面布局,然后在应用程序退出的时将布局保存到xml,以后就以该xml作为标准的
    界面布局文件
  • 停靠窗体换肤
  • 补充一点,关于DockState为非Document的停靠窗体如果需要设置其右键快捷菜单的话可以设置DockContent类中属性TabPageContextMenuStrip为其自己定义的ContextMenu,
效果如下:image
1 0
原创粉丝点击