类库介绍
weiFenLuo.winFormsUI.Docking.dll是开源项目DockPanel Suite的一个类库。是一个很强大的界面布局控件,可以实现像Visual Studio的窗口停靠、拖拽等功能;可以保存自定义的布局为XML文件,可以加载XML配置文件.
该动态库源自开源项目DockPanelSuite,衔接地址是:weifenluo.winformsUI.Docking.dll源代码
可下载其源码、直接使用的dll及示例程序,目前最新版本为2.9.0.0,可在VS2012环境下使用。
Dockpanel中提供了几个可用的类,主要的有两个, 一是DockPanel,另一个是DockContent。DockPanel 是从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