weiFenLuo.winFormsUI.Docking.dll是开源项目DockPanel Suite的一个类库,可以实现像Visual Studio的窗口停靠、拖拽等功能。
官方下载地址:http://sourceforge.net/projects/dockpanelsuite/
其中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
DockPanel Suite的主窗体类似于WinForm中开发MDI应用程序的父窗体,父窗体容纳了所有的停靠窗体,停靠窗体类似于MDI中的子窗体。
红色区域是一个Panel,继承于WeifenLuo.WinFormsUI.Docking.DockPanel,所有的子窗体必须停靠、悬浮、隐藏在该Panel中。因为是基于MDI的应用,所以父窗体属性IsMdiContainer必须设置为true。另外,子窗体都继承于WeifenLuo.WinFormsUI.Docking.DockContent,这样才能停靠在父窗体中。
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,
///
/// 悬浮
///
Float = 1,
///
/// 顶部窗体自动隐藏
///
DockTopAutoHide = 2,
///
/// 左停靠窗体自动隐藏
///
DockLeftAutoHide = 3,
///
/// 底部停靠窗体自动隐藏
///
DockBottomAutoHide = 4,
///
/// 右停靠窗体自动隐藏
///
DockRightAutoHide = 5,
///
/// 停靠窗体文档对象
///
Document = 6,
///
/// 顶部停靠
///
DockTop = 7,
///
/// 左停靠
///
DockLeft = 8,
///
/// 底部停靠
///
DockBottom = 9,
///
/// 右停靠
///
DockRight = 10,
Hidden = 11
}
|
代码中的注释表示的是子窗体停靠父窗体的位置。在继承于DockContent的子窗体中有一个属性ShowHint可以初始化子窗体在显示的时候停靠的方位。
测试效果如下:
DockPanel Suite中提供了一个相应的DockStateChanged来监测子窗体的DockState变化。
停靠窗体也可以选择停靠面板(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
{
///
/// 相对于停靠面板左
///
Left,
///
/// 相对于停靠面板右
///
Right,
///
/// 相对于停靠面板顶部
///
Top,
///
/// 相对于停靠面板底部
///
Bottom
}
|
参数proportion指的是相对停靠面板的占据位置的百分比:
图中红色区域为Form0内置面板区域,该区域下方距离停靠面板百分比为0.4。
停靠窗体存在一个停靠区域,其属性为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;
}
|
可以设置DockPanel容器DocumentStyle来改变停靠窗体的风格,DocumentStyle枚举类型如下:
1
2
3
4
5
6
7
|
public
enum
DocumentStyle
{
DockingMdi,
DockingWindow,
DockingSdi,
SystemMdi,
}
|
默认值为DockingMdi,个人觉得这几种窗体风格的样式相差无几。