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
版权声明:本文为博主原创文章,转载请附上博文链接!

