动态添加dotNetBarManager的dockSite

来源:互联网 发布:大数据解决方案 编辑:程序博客网 时间:2024/06/03 19:50

先在设计界面(我这里用的用户控件)添加控件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都可以随意拖动,如图
这里写图片描述

原创粉丝点击