要用 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
/// 加载窗体停靠
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 =★=*=★=*=★= 加载与保存 布局 =★=*=★=*=★=
/// 保存布局
private void SaveBock()
{
string uiFile = Path.Combine(Application.StartupPath, "CustomUI.xml");
dockPanel1.SaveAsXml(uiFile);
}
/// 加载布局
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);
}
}
///
/// 加载布局
///
///
///
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属性:设置允许子窗体停靠位置
/// 可以停靠在 dockPanel 上下左右四个位置,
/// 但不允许子窗体停靠在 dockPanel 中间
///
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)
));
}
///
/// 可以停靠在 dockPanel 上下左右中 五个位置
///
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%
子窗体与子窗体间的传值可以用委托进行传递,在子窗体声明委托,在主窗体调用委托即可!!