先在设计界面(我这里用的用户控件)添加控件dotNetBarManager控件
如图所示点击Enaable Docunment Docking
会变成下图
然后打开对应的.Designer.cs文件,主要关注this.dotNetBarManager1.FillDockSite的那个dockSite。
注释掉有下划线的两行代码(动态加载就是用这两行代码),或者在设计界面选中bar1删除,都能使用户控件的设计界面回到第一副图所示。
代码如下
private void DockSitePanel_Load(object sender, EventArgs e)
{
//初始先加载3个bar
Bar bar1;
Bar bar2;
Bar bar3;
UserControl1 control1 = new UserControl1();//随手拖的简单用户控件
bar1 = createBar(control1, "bar1", false);
UserControl2 control2 = new UserControl2();//随手拖的简单用户控件
bar2 = createBar(control2, "bar2", false);
UserControl3 control3 = new UserControl3();//随手拖的简单用户控件
bar3 = createBar(control3, "bar3", false);
//下面的代码就是再.Designer.cs里删掉的代码
this.dockSite9.Controls.Add(bar1);//将bar加入dockSite
this.dockSite9.Controls.Add(bar2);
this.dockSite9.Controls.Add(bar3);
//给3个bar排列位置
this.dockSite9.DocumentDockContainer = new DocumentDockContainer(new DocumentBaseContainer[] {
(new DocumentBarContainer ( bar1 ) ),
(new DocumentDockContainer ( new DocumentBaseContainer[] {
(new DocumentBarContainer ( bar2 ) ),
(new DocumentBarContainer ( bar3 ) )
}, eOrientation.Vertical ) )
}, eOrientation.Horizontal);
this.dockSite9.RecalcLayout();
}
bar都是随手拖的简单用户控件,如
具体讲一下给bar排列位置
//给两个bar水平排列如下
new DocumentDockContainer(new DocumentBaseContainer[] {(new DocumentBarContainer(bar1)), (new DocumentBarContainer(bar2))}, eOrientation.Horizontal)
//两个bar垂直排列如下
new DocumentDockContainer(new DocumentBaseContainer[] {(new DocumentBarContainer(bar2)), (new DocumentBarContainer(bar3))}, eOrientation.Vertical)
//用两个bar垂直排列的代码去替换两个bar水平排列代码中DocumentBaseContainer[]{}的new DocumentBarContainer(bar2)部分,就得到
this.dockSite9.DocumentDockContainer = new DocumentDockContainer(new DocumentBaseContainer[] {
(new DocumentBarContainer ( bar1 ) ),
(new DocumentDockContainer ( new DocumentBaseContainer[] {
(new DocumentBarContainer ( bar2 ) ),
(new DocumentBarContainer ( bar3 ) )
}, eOrientation.Vertical ) )
}, eOrientation.Horizontal);
排列效果如下
剩下的代码如下,标记*的是这几个控件的关系,也是在.Designer.cs里能参考的
private Bar createBar(Control control, string titleName = null, bool canClose = true)
{
PanelDockContainer newPdc = new PanelDockContainer()
DockContainerItem newDci = new DockContainerItem();
Bar bar = new Bar();
//设置几个的属性,先在设计界面添加bar后从.Designer.cs把代码Copy过来,也就相差不多了
InitializePDC(newPdc);//设置PanelDockContainer的属性
control.Dock = DockStyle.Fill;
newPdc.Controls.Add(control);//control是真正要显示的内容
InitializeDCI(newDci);//设置DockContainerItem的属性
if (!string.IsNullOrEmpty(titleName))
newDci.Text = titleName;
newDci.Control = newPdc;//***
if (!canClose)
newDci.CanClose = eDockContainerClose.No;
else
newDci.CanClose = eDockContainerClose.Yes;
InitializeBar(bar);//设置bar的属性
bar.Text = titleName;
bar.Controls.Add(newPdc);//***
bar.Items.AddRange(new DevComponents.DotNetBar.BaseItem[] { newDci });//***
return bar;
}
private void InitializePDC(PanelDockContainer newPdc)
{
newPdc.ColorSchemeStyle = eDotNetBarStyle.Office2007;
newPdc.Name = Guid.NewGuid().ToString();
newPdc.Style.Alignment = StringAlignment.Center;
newPdc.Style.BackColor1.ColorSchemePart = eColorSchemePart.BarBackground;
newPdc.Style.BackColor2.ColorSchemePart = eColorSchemePart.BarBackground2;
newPdc.Style.BorderColor.ColorSchemePart = eColorSchemePart.BarDockedBorder;
newPdc.Style.ForeColor.ColorSchemePart = eColorSchemePart.ItemText;
newPdc.Style.GradientAngle = 90;
newPdc.TabIndex = 0;
newPdc.AllowDrop = false;
}
private void InitializeDCI(DockContainerItem newDci)
{
newDci.Name = Guid.NewGuid().ToString();
newDci.Text = "";
}
private void InitializeBar(Bar bar)
{
bar.AlwaysDisplayDockTab = true;//Indicates whether tab that shows all dock containers on the bar is visible all the time.
bar.CanCustomize = false;
bar.CanDockBottom = true;
bar.CanDockDocument = true;
bar.CanDockLeft = true;
bar.CanDockRight = true;
bar.CanDockTop = true;
bar.CanHide = true;
bar.CanUndock = true;
bar.ShowToolTips = true;
bar.IsHandleDoubleClickExternal = true;
bar.Stretch = true;//Specifies whether Bar will stretch to always fill the space in dock site.
bar.TabNavigation = true;
bar.TabStop = true;
bar.AccessibleRole = System.Windows.Forms.AccessibleRole.ToolBar;
// bar.MinimumSize = new Size(300, 200);//要想无限加bar就不能设置最小值,否则bar加多了显示会有问题
bar.DockTabAlignment = DevComponents.DotNetBar.eTabStripAlignment.Top;//Gets or sets the dock tab alignment.
bar.LayoutType = DevComponents.DotNetBar.eLayoutType.DockContainer;
bar.Style = eDotNetBarStyle.Office2007;
}
这些属性比较多,可以自己依次更改属性值Debug看一下效果。
最后再加一个创建bar的publick方法
public void addBar(Control control, Point point, string name = null)
{
Bar bar;
bar = createBar(control, name);
dotNetBarManager1.Bars.Add(bar);
bar.MinimumSize = new Size(300, 200);//先给个MinimumSize,show出来,后面再加MinimumSize== Size.Empty
int x = (int)(point.X + this.Location.X + (this.Width - bar.Width) / 2);
int y = (int)(point.Y + this.Location.Y + (this.Height - bar.Height) / 2);
Point location = new Point() { X = x, Y = y };
dotNetBarManager1.Float(bar, location);//新建bar出现的位置
bar.RecalcLayout();
bar.MinimumSize = Size.Empty;
}
在Form里拖入写好的这个用户控件,再拖入一个按钮,按钮方法为
public void addBar(Control control, Point point, string name = null)
{
Bar bar;
bar = createBar(control, name);
dotNetBarManager1.Bars.Add(bar);
bar.MinimumSize = new Size(300, 200);//先给个MinimumSize,show出来,后面再加MinimumSize== Size.Empty
int x = (int)(point.X + this.Location.X + (this.Width - bar.Width) / 2);
int y = (int)(point.Y + this.Location.Y + (this.Height - bar.Height) / 2);
Point location = new Point() { X = x, Y = y };
dotNetBarManager1.Float(bar, location);//新建bar出现的位置
bar.RecalcLayout();
bar.MinimumSize = Size.Empty;
}
运行后点击按钮如图
bar都可以随意拖动,如图