weiFenLuo.winFormsUI.Docking.dll是开源项目DockPanel Suite的一个类库。是一个很强大的界面布局控件,可以实现像Visual Studio的窗口停靠、拖拽等功能;可以保存自定义的布局为XML文件,可以加载XML配置文件
下图是本文示例程序界面,左边面板是仿outlook效果的控件面板,标签项目都是普通form,它们都是可以任意停靠位置的。
Dockpanel中提供了几个可用的类,主要的有两个, 一是DockPanel,另一个是DockContent。DockPanel 是从panel继承出来的,
用于提供可浮动的dock的子窗口,DockContent是从form类中继承出来的, 用于提供可浮动的窗口基类. 就是说: DockContent对象可以在DockPanel对象中任意贴边, 浮动, TAB化等.
WeiFenLuo.winFormsUI.Docking.dll的使用
1.建立一个WinForm工程,默认生成了一个WinForm窗体Form1。
2.引用—>添加引用—>浏览—>weiFenLuo.winFormsUI.Docking.dll。
3.窗体属性IsMdiContainer设置为True。
4.工具箱—>右键—>选择项—>.net组件—>浏览—>weiFenLuo.winFormsUI.Docking.dll—>在工具箱出现dockPanel。
5.将dockPanel拖到窗体Form1上,设置Dock属性,我设置的是:Fill。
演示程序说明:
form1是主窗体,form2是仿outlook效果窗体,其它几个是普通窗体。
另一个解决方案outlookbar是仿outlook效果控件的源代码,请参考。
主窗体代码:
using OutLookBarDemo;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI.Docking;
namespace dockingTest
{
public partial class Form1 : Form
{
//QQ群:98596273 网站: http://www.skcircle.com 专门研究网络营销技术及相关软件开发
private DeserializeDockContent m_deserializeDockContent;
Form2 f1;
win1 f2;
win2 f3;
win3 f4;
win4 f5;
win5 f6;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
f1 = new Form2();
f1.PanelEventA += PanelEventA;
f1.PanelEventB += PanelEventB;
f1.PanelEventC += PanelEventC;
f1.setEventHandler();
f2 = new win1();
f3 = new win2();
f4 = new win3();
f5 = new win4();
f6 = new win5();
//Form2 form2 = new Form2();
//form2.Show(this.dockPanel1);
//form2.DockTo(this.dockPanel1, DockStyle.Left);
addMenuItem();
m_deserializeDockContent = new DeserializeDockContent(GetContentFromPersistString);
string configFile = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "DockPanel.config");
if (File.Exists(configFile))
{
try
{
dockPanel1.LoadFromXml(configFile, m_deserializeDockContent);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
f1.Show(dockPanel1, DockState.DockLeft); //DockAlignment.Bottom, DockState.Document
}
private void addMenuItem()
{
var names = new string[] { "信息查询", "购物车管理", "电子邮件", "密码管理", "时间设置" };
foreach (var m in names)
{
ToolStripItem item = new ToolStripMenuItem();
item.Name = m;
item.Text = m;
item.Click += new EventHandler(contextMenuStrip1_ItemClick);
menuStrip.Items.Add(item);
}
}
private void contextMenuStrip1_ItemClick(object sender, EventArgs e)
{
ToolStripItem item = (ToolStripItem)sender;
showWindows(item.Name);
}
private void showWindows(string name)
{
switch (name)
{
case "信息查询":
if (f2.IsDisposed)
f2 = new win1();
f2.Show(dockPanel1, DockState.Document);
break;
case "购物车管理":
if (f3.IsDisposed)
f3 = new win2();
f3.Show(dockPanel1, DockState.Document);
break;
case "电子邮件":
if (f4.IsDisposed)
f4 = new win3();
f4.Show(dockPanel1, DockState.Document);
break;
case "密码管理":
if (f5.IsDisposed)
f5 = new win4();
f5.Show(dockPanel1, DockState.Document);
break;
case "时间设置":
if (f6.IsDisposed)
f6 = new win5();
f6.Show(dockPanel1, DockState.Document);
break;
}
}
private IDockContent GetContentFromPersistString(string persistString)
{
if (persistString == typeof(Form2).ToString())
return f1;
else if (persistString == typeof(win1).ToString())
return f2;
else if (persistString == typeof(win2).ToString())
return f3;
else if (persistString == typeof(win3).ToString())
return f4;
else if (persistString == typeof(win4).ToString())
return f5;
else if (persistString == typeof(win5).ToString())
return f5;
return null;
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
string configFile = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "DockPanel.config");
dockPanel1.SaveAsXml(configFile);
}
public void AddMenuItem(ToolStripItem control)
{
if (menuStrip.InvokeRequired)
{
menuStrip.BeginInvoke(new MethodInvoker(() =>
{
menuStrip.Items.Add(control);
}));
}
else
{
menuStrip.Items.Add(control);
}
}
private void 窗口2ToolStripMenuItem_Click(object sender, EventArgs e)
{
var obj = sender.ToString();
showWindows(obj);
}
public void PanelEventA(object sender, EventArgs e)
{
Control ctrl = (Control)sender;
PanelIcon panelIcon = ctrl.Tag as PanelIcon;
string clickInfo = string.Empty;
switch (panelIcon.Index)
{
case 0:
clickInfo = "信息查询";
break;
case 1:
clickInfo = "购物车管理";
break;
}
showWindows(clickInfo);
}
public void PanelEventB(object sender, EventArgs e)
{
Control ctrl = (Control)sender;
PanelIcon panelIcon = ctrl.Tag as PanelIcon;
string clickInfo = string.Empty;
switch (panelIcon.Index)
{
case 0:
clickInfo = "电子邮件";
break;
case 1:
clickInfo = "密码管理";
break;
}
showWindows(clickInfo);
}
public void PanelEventC(object sender, EventArgs e)
{
Control ctrl = (Control)sender;
PanelIcon panelIcon = ctrl.Tag as PanelIcon;
string clickInfo = string.Empty;
switch (panelIcon.Index)
{
case 0:
clickInfo = "时间设置";
break;
}
showWindows(clickInfo);
}
}
}
仿outlook效果窗体的代码:
这个子窗体与主界面通讯方式是使用了几个Action把消息委托给主界面。
using OutLookBarDemo;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI.Docking;
namespace dockingTest
{
public partial class Form2 : DockContent
{
public Action<object,EventArgs> PanelEventA;
public Action<object, EventArgs> PanelEventB;
public Action<object, EventArgs> PanelEventC;
IconPanel iconPanel1 = null;
IconPanel iconPanel2 = null;
IconPanel iconPanel3 = null;
public Form2()
{
InitializeComponent();
outlookBar.BorderStyle = BorderStyle.FixedSingle;
outlookBar.Initialize();
iconPanel1 = new IconPanel();
iconPanel2 = new IconPanel();
iconPanel3 = new IconPanel();
outlookBar.AddBand("工具条A", iconPanel1);
outlookBar.AddBand("工具条B", iconPanel2);
outlookBar.AddBand("工具条C", iconPanel3);
}
public void setEventHandler()
{
//0
iconPanel1.AddIcon("信息查询", Image.FromFile(@"Image\1.ico"), new EventHandler(PanelEventA));
//1
iconPanel1.AddIcon("购物车管理", Image.FromFile(@"Image\2.ico"), new EventHandler(PanelEventA));
//2
iconPanel2.AddIcon("电子邮件", Image.FromFile(@"Image\3.ico"), new EventHandler(PanelEventB));
//3
iconPanel2.AddIcon("密码管理", Image.FromFile(@"Image\4.ico"), new EventHandler(PanelEventB));
//4
iconPanel3.AddIcon("时间设置", Image.FromFile(@"Image\4.ico"), new EventHandler(PanelEventC));
outlookBar.SelectBand(0);
}
private void Form2_Load(object sender, EventArgs e)
{
}
}
}
本文源码资料下载:
扫码收费1元,勇哥用以支付本站服务器费用。
另外的选择:
也可以使用netMarketing类库的dockingHelper类来更方便的使用docking功能。这个类可以极大的简化docking操作,例如你只需要下面的代码就可以创建并显示出docking的子窗体。
var dock = new dockingHelper("docking1", this.dockPanel1, new List<myForm>()
{
new dataForm("生产数据窗口"),
new setupForm("系统设置窗口"),
});
详细可以浏览下面的贴子:
[netMarketing类库] dockingHelper类:Docking(窗体停靠控件)的辅助类
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

