当前位置:首页 > C#编程 > C#/.net框架 > 正文内容

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

秋天2年前 (2022-05-09)C#/.net框架882

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


主窗体代码:

C#
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把消息委托给主界面。

C#
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)
        {
           
        }
    }}


C#源代码下载(www.skcircle.com)


另外的选择:


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

 

扫描二维码推送至手机访问。

版权声明:本文由7点博客发布,如需转载请注明出处。

本文链接:http://6dot.cn/?id=115

标签: .NET.NET框架
分享给朋友:

“WinFormsUI.Docking.dll和OutlookBar的应用实例(带C#源码)” 的相关文章

C# 控件闪烁问题的解决

C# 控件闪烁问题的解决

说一下解决C#下控件闪烁的几个问题,如下:  listview和datagridview显示数据闪烁 自定义控件的显示闪烁listbox滚动条拖动闪烁面板中控件过多的闪烁propertyGrid点击和修改项目缓慢的问题richtextbox控件的刷新显示问题此类问题对于界面复杂规...

C# Modelbus crc16计算校验和程序

C# Modelbus crc16计算校验和程序

我们手里一个无刷电机,采用485的modelbus crc16协议来控制。因此需要一个计算校验和的工具。源码:C#using System;using System.Collections.Generic;using System.ComponentModel;usin...

C#中使用RegisterWindowMessage进行进程之间进行通讯

C#中使用RegisterWindowMessage进行进程之间进行通讯

注:大家都知道在window里,进程之间通讯可以用消息通讯。但是有个较冷门的知识就是RegisterWindowMessage。一般的sendmessage和postmessage是需要在窗体程序间进行通讯,你得知道对方窗口的句柄。这个句柄每次启动程序时是系统分配的,每次不一样。有了这个Regist...

C#:多进程开发,控制进程数量

C#:多进程开发,控制进程数量

正在c#程序优化时,如果多线程效果不佳的情况下,也会使用多进程的方案,如下:C#System.Threading.Tasks.Task task=System.Threading.Tasks.Task.Factory.StartNew(     &...

索引器(C# 编程指南)

索引器(C# 编程指南)

 索引器允许类或结构的实例就像数组一样进行索引。 无需显式指定类型或实例成员,即可设置或检索索引值。 索引器类似于属性,不同之处在于它们的访问器需要使用参数。以下示例定义了一个泛型类,其中包含用于赋值和检索值的简单 get 和 set 访问器方法。&...

C# 当前不会命中断点 还没有为该文档加载任何符号

C# 当前不会命中断点 还没有为该文档加载任何符号

这个问题网上的经验大概如下:1。 清空方案,重新编译2。 删除项目bin目录下的东西,重新编译3。 解决相互引用的问题。4。 确保不是run的release5。把项目编译改为x866。 好像没发现其它的了。。。这些解决不了我们手上的项目的问题。我们的工程有几十个项目。我长话短说,解决方法是:引导项目...

发表评论

访客

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