# MWinNet **Repository Path**: Shard-Code/MWinNet ## Basic Information - **Project Name**: MWinNet - **Description**: .Net桌面插件式开发框架,可定制菜单栏、工具栏、浮动窗口、状态栏和右键菜单。菜单栏、工具栏、状态栏和右键菜单每一项都对应一个Command,每个Command可以自定义实现自己的功能。所有的UI和功能都通过配置文件进行配置,完全插件化开发。 - **Primary Language**: C# - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 96 - **Created**: 2021-10-08 - **Last Updated**: 2021-10-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MWinNet ## 框架介绍 [MWinNet](https://github.com/MrocCyen/MWinNet)是基于.Net winform平台的插件式开发框架,可以根据配置文件自定义界面,通过实现框架的命令接口实现相应的功能,达到功能与界面的完全分离,添加新功能只需要将配置文件和对应的dll放入相应的文件夹内,完全插件化。 ![](MainForm.jpg) 目前框架的编写已经完成了主菜单、浮动窗体、工具栏和状态栏,右键菜单还需要完善。希望大家可以多多提提意见,共同进步,同时如果你觉得这个项目还行,欢迎[fork&star](https://github.com/MrocCyen/MWinNet)。 ## 框架结构 ### 核心结构 #### MWinNet.Core 整个框架的核心,主要包括插件的初始化,插件树的构造,命令接口定义和通用工具类的定义。Plugin和PluginTree是插件系统的核心,每个配置文件项都对应一个插件,比如: ``` ``` 系统初始化的时候会读取配置文件,然后根据不同的标签构造相应的Plugin对象,然后构造插件树。 除此之外,Core中还有文件操作,字符串操作等公用的工具类。 #### MWinNet.Frame 包括界面类型的定义和框架界面的构造。界面类型包括Menu、WrokBench、DockBar、StatusBar和ContextMenu等。界面构造根据PluginTree中的Plugin构造出对应的界面对象,然后加进主界面中。 IViewContent接口是给DockWindow中添加控件的接口,每个实现了IViewContent接口的类都有与之对应的DockWindow,控件的初始化就可以放在实现了IViewContent接口的类中。 #### MWinNet.Dock 类库基于WeifenLuo.WinFormsUI.Docking修改而来,支持浮动窗口的所有特性。 ## 框架指南 ### 配置文件 配置文件示例格式如下: ``` ``` #### Menu节点 Menu是菜单节点,所有的菜单项都在该节点下定义,在Menu节点中有三个子节点,MenuTab、MenuGroup、MenuItem。MenuTab是每个菜单Tab的定义节点,MenuItem是每个菜单项的定义节点,MenuGroup可以包含一个或者多个MenuItem节点。 属性: - path:每个菜单项都对应一个路径,该路径会添加进插件树中相应的分支中。 - id:每个菜单项的唯一标识。 - caption:每个菜单项的名称。 - image:每个菜单项的图标。 - index:菜单项索引值。 - assemblyName:菜单项命令对应的类名所在的程序集。 - className:菜单项命令对应的类名,需要加上命名空间。 #### DockBar节点 DockBar是浮动窗口节点。所有的浮动的窗口的定义都在DockBar节点中。 DockBar下有DockItem子节点,定义每个浮动窗口的属性。 属性: - path:每个浮动窗口对应一个路径,该路径会添加进插件树中相应的分支中。 - id:DockBar唯一的标识。 - dockType:DockBar的类型,有Float、DockTopAutoHide、DockLeftAutoHide、DockBottomAutoHide、DockRightAutoHide、Document、DockTop、DockLeft、DockBottom和DockRight。 - dockWindowClass:浮动窗体对应的窗体类型名,需要加上命名空间。 - assemblyName:浮动窗体对应的窗体所在的程序集。 #### ToolBar节点 ToolBar是工具栏节点。所有工具栏的按钮都定义在ToolBar节点中。 ##### ToolBarButton子节点: 工具栏按钮定义节点。 属性: - path:每个工具栏按钮对应一个路径,该路径会添加进插件树中相应的分支中。 - id:ToolBarButton唯一的标识。 - displayStyle:样式展示类型,有Image、Text和ImageAndText。 - image:图片路径。 - label:显示的文本。 - index:排序索引值。 - assemblyName:所在的程序集。 - className:按钮命令对应的类名,需要加上命名空间。 ##### ToolBarSeparator子节点: 分隔标记定义节点。 属性: - path:每个工具栏分隔标记对应一个路径,该路径会添加进插件树中相应的分支中。 - id:ToolBarSeparator唯一的标识。 #### StatusBar节点 StatusBar是状态栏节点,目前只支持了进度条和标签的设置。 ##### StatusProgressBar子节点 进度条子节点,可以通过设置实现相应的进度信息展示的功能。 属性: - path:每个进度条对应一个路径,该路径会添加进插件树中相应的分支中。 - id:StatusProgressBar唯一的标识。 - value:进度初始值。 - length:进度条长度。 ##### StatusLabel子节点 状态栏标签。 属性: - path:每个标签对应一个路径,该路径会添加进插件树中相应的分支中。 - id:StatusLabel唯一的标识。 - label:标签的展示文本。 ### Command 每个界面元素,如菜单、工具栏等都可以点击然后去实现相应的功能,通过抽象,我把功能代码从界面中抽离了出来,单独放在了一个实现了Command接口的类中。 command类实现了ICommand接口,里面有两个方法: ``` public abstract class Command : ICommand { public abstract void Run(); public abstract bool Enable(); } ``` - Run:具体的功能代码。 - Enable:设置是否可用。 示例: ``` public class CreateCommand : Command { public override bool Enable() { return true; } public override void Run() { MessageBox.Show("Hello World!"); } } ``` ### IViewContent IViewContent接口是给DockWindow中添加控件的接口。 ``` public interface IViewContent { Control ViewControl { get; set; } } ``` 实现IViewContent可以给需要添加的窗口添加控件,这样让窗体尽可能多的关系业务逻辑。 示例代码: ``` public class MidViewContent : IViewContent { public MidViewContent() { } private RichTextBox _box = new RichTextBox(); public Control ViewControl { get { _box.Dock = DockStyle.Fill; _box.Name = "RichTextBox"; return _box; } set { _box = (RichTextBox)value; } } } ```