WeifenLuo.WinFormsUI.Docking小应用

要用 WeifenLuo.WinFormsUI.Docking 首先要下载: WeifenLuo.WinFormsUI.Docking 。

在当前工程“解决方案 - 引用”中 >> 右击引用 >> 浏览 >> 找到你存放的 WeifenLuo.WinFormsUI.Docking 添加。

主窗体的   this.IsMdiContainer =true; //设置主窗体为多文档窗体。

建议先复制到当前工程的 \bin\Debug 文件夹中。。。

dockPanel1.DocumentStyle =DocumentStyle.DockingSdi ;

DocumentStyle属性有四种形式:用的时候好像没有什么区别,不过DockingSdi 还是有点区别

DockingMdi                子窗体停靠在中间时,标签栏右侧显示小三角和关闭钮。

DockingWindow       子窗体停靠在中间时,标签栏右侧显示小三角和关闭钮。(感觉和DockingMdi相似)

DockingSdi                单个子窗体停靠在中间时,将没有标签栏

SystemMdi                 子窗体停靠在中间时,会报错(停靠状态无效)。(XX.Show(this.dockPanel1,DockState.Document); )   (XX=子窗体名)


拖动后的效果:




在主窗体中工具箱中加入 dockPanel 

.


右击工具箱中的工具标题 >>选择项>> 在弹出的对话框中( 选择浏览>>找到你存放WeifenLuo.WinFormsUI.Docking的位置>>选择 - 打开>>确定)....这样,你就可以在工具栏中看到 DockPanel控件

主窗体:双击DockPanel 或拖入窗体中,设置你的DockPanel...Anchor属性:  Top, Bottom, Left, Right,  Size属性:XXX,XXX(X=数字,设置你要的大小)   当然,你也可以在Dock属性:Fill

        /// <summary> 加载窗体停靠 </summary>
        private void LoadDock()
        {
            this.IsMdiContainer = true;
            dockPanel1.DocumentStyle = DocumentStyle.DockingSdi;
            Form2 Treev = new Form2();  //↘
            Form3 Listv = new Form3();   //  实例化子窗体
            Form4 Richt = new Form4();  //↗
            Treev.Show(this.dockPanel1, WeifenLuo.WinFormsUI.Docking.DockState.DockLeftAutoHide);//停靠左侧收起
            Listv.Show(this.dockPanel1, WeifenLuo.WinFormsUI.Docking.DockState.DockLeftAutoHide);//停靠左侧收起

            Richt.Show(this.dockPanel1, DockState.Document);  // Document 停靠中间
        }
        #region =★=*=★=*=★= 加载与保存 布局 =★=*=★=*=★=
        /// <summary> 保存布局 </summary>
        private void SaveBock()
        {
            string uiFile = Path.Combine(Application.StartupPath, "CustomUI.xml");
            dockPanel1.SaveAsXml(uiFile);
        }
        /// <summary> 加载布局 </summary>
        private void LoadBock()
        {
            string uiFile = Path.Combine(Application.StartupPath, "CustomUI.xml");
            if (File.Exists(uiFile))
            {
                WeifenLuo.WinFormsUI.Docking.DeserializeDockContent ddContent =
                        new WeifenLuo.WinFormsUI.Docking.DeserializeDockContent(GetContentFromPersistString);
                dockPanel1.LoadFromXml(uiFile, ddContent);
            }
        }
        /// <summary>
        /// 加载布局
        /// </summary>
        /// <param name="persistString"></param>
        /// <returns></returns>
        private IDockContent GetContentFromPersistString(string persistString)
        {
            try
            {
                if (persistString == typeof(Form2).ToString())
                {
                    return new Form2();
                }
                if (persistString == typeof(Form3).ToString())
                {
                    return new Form3();
                }
                if (persistString == typeof(Form4).ToString())
                {
                    return new Form4();
                }
            }
            catch (Exception)
            {
                Console.WriteLine(persistString);
            }
            throw new Exception();
        }
        #endregion
        //窗体加载
        private void Form1_Load(object sender, EventArgs e)
        {
            this.IsMdiContainer = true;
            if (!File.Exists(@"CustomUI.xml"))  /* 如果工程里没有指定的XML文档,则调用默认的布局,否则调用保存的布局 */
            {
                 this.LoadDock();
            }
            else { this.LoadBock(); }
        }
        /* 退出前,保存布局 */
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            //this.SaveBock();
        }

     当不小心把停靠窗体关闭后,应该在主窗体写一个调出子窗体的点击事件....

    要实现各个dockpanle子窗体之间的互动,例如,vs编辑器中,设计界面的时候,选择一个文本框,属性框中的属性随之改变,使用委托可以解决

   限定子窗体停靠位置:

            #region DockAreas属性:设置允许子窗体停靠位置
        /// <summary>可以停靠在 dockPanel 上下左右四个位置,
        /// 但不允许子窗体停靠在 dockPanel 中间
        /// </summary>
        private void DockNum4()
        {
            this.DockAreas = ((WeifenLuo.WinFormsUI.Docking.DockAreas)
              (((((WeifenLuo.WinFormsUI.Docking.DockAreas.Float
              | WeifenLuo.WinFormsUI.Docking.DockAreas.DockLeft)
              | WeifenLuo.WinFormsUI.Docking.DockAreas.DockRight)
              | WeifenLuo.WinFormsUI.Docking.DockAreas.DockTop)
              | WeifenLuo.WinFormsUI.Docking.DockAreas.DockBottom)
              ));
        }
        /// <summary>
        /// 可以停靠在 dockPanel 上下左右中 五个位置
        /// </summary>
        private void DockNum5()
        {
            this.DockAreas = ((WeifenLuo.WinFormsUI.Docking.DockAreas)
              ((((((WeifenLuo.WinFormsUI.Docking.DockAreas.Float
              | WeifenLuo.WinFormsUI.Docking.DockAreas.DockLeft)
              | WeifenLuo.WinFormsUI.Docking.DockAreas.DockRight)
              | WeifenLuo.WinFormsUI.Docking.DockAreas.DockTop)
              | WeifenLuo.WinFormsUI.Docking.DockAreas.DockBottom)
              | WeifenLuo.WinFormsUI.Docking.DockAreas.Document)  /* 允许子窗体停靠中间 */
              ));
        }
        #endregion

子窗体:

添加子窗体,   using WeifenLuo.WinFormsUI.Docking;

 using WeifenLuo.WinFormsUI.Docking;
public partial class Form2 :DockContent  //把继承修改为 DockContent .

CloseButton属性:子窗体在 dockPanel 中,标签中关闭钮是否起作用,true起作用

AutoHidePortion属性: 子窗体在 dockPanel 中,伸缩状态时高(或宽)的比例  0.25 X 100% = 25%

dockPanel 中,Dock(Top,Right...)Portion ,在子窗体固定时,显示靠边时的宽(或高)比例 0.25 X 100% = 25%

子窗体与子窗体间的传值可以用委托进行传递,在子窗体声明委托,在主窗体调用委托即可!!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值