C#.NET 窗体停靠控件WeifenLuo.WinFormsUI.Docking.dll的使用

类库介绍

weiFenLuo.winFormsUI.Docking.dll是开源项目DockPanel Suite的一个类库。是一个很强大的界面布局控件,可以实现像Visual Studio的窗口停靠、拖拽等功能;可以保存自定义的布局为XML文件,可以加载XML配置文件.

该动态库源自开源项目DockPanelSuite,衔接地址是:weifenluo.winformsUI.Docking.dll源代码
可下载其源码、直接使用的dll及示例程序,目前最新版本为2.9.0.0,可在VS2012环境下使用。

Dockpanel中提供了几个可用的类,主要的有两个, 一是DockPanel,另一个是DockContentDockPanel 是从panel继承出来的, 用于提供可浮动的dock的子窗口,DockContent是从form类中继承出来的, 用于提供可浮动的窗口基类. 就是说: DockContent对象可以在DockPanel对象中任意贴边, 浮动, TAB化等. 

使用说明

主窗体的建立

  • 创建窗体应用程序WeifenLuoUISample,添加引用WeifenLuo.WinFormsUI.Docking.dll
  • 重命名主窗体为MainWnd作为测试主窗口,设置主窗体Mainwnd的IsMdiContainer属性为true
  • 添加dockPanel控件到工具箱中:工具箱—>右键—>选择项—>.net组件—>浏览—>weiFenLuo.winFormsUI.Docking.dll,此时在工具箱将出现dockPanel,将dockPanel拖放到Mainwnd中,设置dockpanel的相关属性:dockPanel.Dock=Fill

停靠窗体的建立

【1】新建一个Windows 窗体Form1,修改窗体继承于WeifenLuo.WinFormsUI.Docking.DockContent:
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WeifenLuoUISample
{
    public partial class Form1 : WeifenLuo.WinFormsUI.Docking.DockContent
    {
        public Form1()
        {
            InitializeComponent();
        }
    }
}


【2】在MainWnd中添加Load事件的响应代码来创建停靠窗口
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI.Docking;

namespace WeifenLuoUISample
{
    public partial class MainWnd : Form
    {
        public MainWnd()
        {
            InitializeComponent();
        }

        private void MainWnd_Load(object sender, EventArgs e)
        {
            Form1 form = new Form1();
            form.Show(_dockPanel, DockState.DockLeft);
        }
    }
}

【3】运行效果如下

保存界面布局

【1】新建一个Windows 窗体Form2,修改窗体继承于WeifenLuo.WinFormsUI.Docking.DockContent,同上。

【2】设置Form1与Form2的HideOnClose属性为True,表示关闭窗体时,不是真的关闭销毁资源,而是隐藏。

【3】添加成员变量,用于保存界面布局:
        private static string _dockpanelConfigFile = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "DockManager.config");
        private Form1 _form1 = new Form1();
        private Form2 _form2 = new Form2();

【4】添加2个子菜单的Click事件,用于显示窗体Form1与Form2
       private void form1ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            _form1.Show(_dockPanel, DockState.DockLeft);            
        }

        private void form2ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            _form2.Show(_dockPanel, DockState.Document);
        }

【5】主窗体加载时,显示上次保存的界面,需要编写DeserializeDockContent回调函数,很简单:
回调函数:
  public IDockContent GetDeserializeDockContent(string persistString)
        {
            if (persistString == typeof(Form1).ToString())
                return _form1;
            if (persistString == typeof(Form2).ToString())
                return _form2;
            return null;
        }    

主窗体加载,加载上次保存的界面:
 private void MainWnd_Load(object sender, EventArgs e)
        {         
            try
            {
                if (File.Exists(_dockpanelConfigFile))
                    _dockPanel.LoadFromXml(_dockpanelConfigFile, new DeserializeDockContent(GetDeserializeDockContent));
            }
            catch (Exception)
            {
            }

        }

【6】主窗体关闭时,保存当前的界面:
    private void MainWnd_FormClosing(object sender, FormClosingEventArgs e)
        {
            _dockPanel.SaveAsXml(_dockpanelConfigFile);    
        }



【7】注意
这种方式只能保存DockPanel中的界面布局,而主窗体的尺寸、显示的位置是无法保存时,所以需要保存主窗体的尺寸与位置的需要写一个配置文件,如.Config,保存主窗体启动的位置与尺寸,很简单,这里不再详细介绍。

【8】源码

WeiFenLuoSample

参考文献:http://blog.sina.com.cn/s/blog_5420e0000101et2e.html



你可能感兴趣的:(控件,DockPanel)