一、前言
最近使用Winform 做项目,发现Winform 非常好用,特别是之前有个客户定制需要涉及UI的,用VC++ 不是一般的难搞,后来考虑过以前玩过Winform ,修改窗体和控件的颜色都非常方便,因此果断直接上。
之前在使用VC++ 的MDI风格,自己搭了一个多窗体视图切换Demo,虽说好用,但是有一个Bug 却一直解决不了,因此,做了两个项目后,就不再使用了。
后面使用C#做项目的时候,由于需要一系列型号的共用一个软件,我想要是Winform的pandel 有Dock 的风格就方便多了。于是,百度一下,发现果然有,就是开源控件“DockPanel”
这个开源项目不是一般的好用,因此,这篇也是记录和总结一下,自己使用这个控件过程。
二、DockPanel使用
1、介绍
weiFenLuo.winFormsUI.Docking.dll是开源项目DockPanel Suite的一个类库,可以实现像Visual Studio的窗口停靠、拖拽等功能。
控件官方下载地址:http://sourceforge.net/projects/dockpanelsuite/
2、使用环境 Visual Studio 2010
3、使用方法
(1)新建解决方式,Windows 窗体应用程序
(2)修改WinForm窗体属性,设置其为MDI窗体(多文档窗体)如图:
(3)将WeifenLuo.WinFormsUI.Docking.dll 拷贝到工程目录,的bin 目录下Debug 和 Release 文件夹中。
(4)解决方案管理器 --> 引用 --> 右键点击添加引用 --> 点击浏览 --> Debug 和 Release 文件夹 -->
选择WeifenLuo.WinFormsUI.Docking.dll --> 点击确定 如图:
(5)工具箱-->选择项...-->.Net Framework组件-->浏览-->WeifenLuo.WinFormsUI.Docking.dll
如图1:
图2:
(6)拖动工具箱中的DockPanel控件到MainForm窗体,拖动时如出现如下错误:
出现这个问题的原因是,建立工程时,目标框架选择的是.Net FrameWork 4 Profile。
解决问题的方式是将在工程属性中,修改目标框架为 .Net FrameWork 4.
(7) 在主窗体放入一个dockpanel 之后,新建一个子窗体并修改其代码中修改窗体继承于DockContent,如下图:
using WeifenLuo.WinFormsUI.Docking;
namespace DockPanel_Test
{
public partial class Form2 : DockContent
{
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
}
}
}
Form2 form2 = new Form2();
form2.Show(dockPanel1);
form2.DockState = DockState.DockLeft; //初始化子窗体显示在左边
编译,运行如下图,可以实现类似VC++ 中MDI 风格
可以增加多几个窗体,实现都视图操作。
三、使用总结
1、子窗体一般使用单例模式,这样子资源可以重复利用;
具体讲子窗体代码修改如下:
private static Form2 mInstance;
private static mDockState;
private Form2() //私有构造方法
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
}
#region 静态实例初始化函数
public static Form2 GetInstance()
{
if (mInstance == null)
{
mInstance = new Form2();
}
return mInstance;
}
#endregion
#region 为了保证在关闭某一浮动窗体之后,再打开时能够在原位置显示,要对浮动窗体处理,处理窗体的DockstateChanged事件,标签窗体dock位置改变,记录到公共类
private void FrmFunction_DockStateChanged(object sender, EventArgs e)
{
//关闭时(dockstate为unknown) 不把dockstate保存
if (mInstance != null)
{
if (this.DockState == DockState.Unknown || this.DockState == DockState.Hidden)
{
return;
}
mDockState = this.DockState;
}
}
#endregion
#region 关闭事件
private void FrmFunction_FormClosed(object sender, FormClosedEventArgs e)
{
mInstance = null; // 否则下次打开时报错,提示“无法访问已释放对象”
}
#endregion
}
参考文章:
http://blog.csdn.net/zhangyuehua123/article/details/6861401