DEV控件及如何实现一些功能的应用(附带PPT讲解)

如何利用DEV控件实现选项卡式浏览应用程序:实现如下效果:如感觉看了累的,请下载我为大家准备的PPT及免费视频讲解:/Files/0771bc/DEV控件.rar

 

HIS课程学习群:85281015

 

代码下载地址(工具和视频太大,想要的留个邮箱,我发到你们邮箱):/Files/0771bc/DevTest.rar

/Files/0771bc/DockTest.rar

 

实现步骤如下:

一、选项卡式浏览实现方法

选项卡式浏览需要的控件及类库:

使用第三方控件WinFormsUI.Docking.dll;
他是开源项目DockPanel Suite的一个类库,可以实现像Visual Studio的窗口停靠、拖拽等功能。该项目下载地址:http://sourceforge.net/projects/dockpanelsuite

选项卡式浏览实现思路(如下图所示):

新建一个窗体,在工具箱上右键—>选择项,找到WeifenLuo.WinFormsUI.Docking.dll;
将dockPanel拖到窗体Form1上 ;
设置Form1的IsMdiContainer属性为true,表示该窗体是一个父窗体;
在代码中修改窗体继承于DockContent,如public partial class Form2 : DockContent ;
然后显示子窗体,如:Form2 frm= new Form2();
 frm.Show(this.dockPanel1);

二、动态菜单实现方法

初始状态如:

 

 

加载菜单之后的效果:

加载父/子级菜单:

给自动菜单加事件:

三、实现过程-定义接口

定义窗体基类并实现接口

四、主体框架部分实现过程

4. 加载菜单信息:

复制代码
DataRow[] drs = dt.Select("ParentNodeId = 0");
                foreach (DataRow dr in drs)
                {
BarSubItem barSubItem = new BarSubItem(barManager, dr[“DisplayName                     mainMenu.InsertItem(mainMenu.ItemLinks[mainMenu.ItemLinks.Count - 1], barSubItem);
                    foreach (DataRow item in dt.Rows)
                    {
                        if (dr["NodeId"]== item["ParentNodeId"])//属于该节点
                        {
                            BarItem barSmallItem = new BarButtonItem(barManager, item["DisplayName"]);//创建一个子菜单
                            barSubItem.AddItem(barSmallItem);                            barSmallItem.ItemClick += new ItemClickEventHandler(DllPlugInItemClick);
plugins.Add(已经产生的菜单信息加入集合);
                        }
                    }
                }
复制代码

5. 动态反射菜单信息:

 

复制代码
private void DllPlugInItemClick(object sender, ItemClickEventArgs e){            
    string path = Application.StartupPath+"\\";
                Plugin plugin=plugins[e.Item.Caption];
                Assembly ab = Assembly.LoadFrom(path + plugin.NameSpaceName + "." + plugin.Extensions);
            Type[] types = ab.GetTypes();
            foreach (Type t in types)
            {
                if (t.GetInterface("IPlugin") != null&&t.Name==plugin.ClassName)
                {
             if (loadedPlugins.Contains(t.FullName))
                        return;
                       IPlugin selObj = (IPlugin)ab.CreateInstance(t.FullName);
                       selObj.ShowDlg(this.dockPanel1, e.Item.Caption);
            loadedPlugins.Add(t.FullName);
                }
            }
        }
复制代码

6. 防止重开一个面板:

 

//关闭选项卡时发生
if (loadedPlugins.Contains(e.Content.DockHandler.Form.GetType().FullName))
    {
        loadedPlugins.Remove(e.Content.DockHandler.Form.GetType().FullName);
    }

最终效果图如下:

posted @   idonet  阅读(5185)  评论(17编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示