动态添加dotNetBarManager的dockSite

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

猜你喜欢

转载自blog.csdn.net/m0_38110784/article/details/75669923