WinFormsUI.Docking.dll和OutlookBar的应用实例(带C#源码)

weiFenLuo.winFormsUI.Docking.dll是开源项目DockPanel Suite的一个类库。是一个很强大的界面布局控件,可以实现像Visual Studio的窗口停靠、拖拽等功能;可以保存自定义的布局为XML文件,可以加载XML配置文件

下图是本文示例程序界面,左边面板是仿outlook效果的控件面板,标签项目都是普通form,它们都是可以任意停靠位置的。


Dockpanel中提供了几个可用的类,主要的有两个, 一是DockPanel,另一个是DockContent。DockPanel 是从panel继承出来的,

 用于提供可浮动的dock的子窗口,DockContent是从form类中继承出来的, 用于提供可浮动的窗口基类. 就是说: DockContent对象可以在DockPanel对象中任意贴边, 浮动, TAB化等. 


image.png


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效果控件的源代码,请参考。

image.png


主窗体代码:

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元,勇哥用以支付本站服务器费用。


支付1元或购买VIP会员后,才能查看本内容!立即支付升级会员查询订单



另外的选择:


也可以使用netMarketing类库的dockingHelper类来更方便的使用docking功能。这个类可以极大的简化docking操作,例如你只需要下面的代码就可以创建并显示出docking的子窗体。

var dock = new dockingHelper("docking1", this.dockPanel1, new List<myForm>()
                {
                    new dataForm("生产数据窗口"),
                    new setupForm("系统设置窗口"),
                });

image.png

详细可以浏览下面的贴子:


[netMarketing类库] dockingHelper类:Docking(窗体停靠控件)的辅助类



--------------------- 

作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!



本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864