WPF权限控制——【2】模块、菜单、按钮
周末没有工作,没有写博客,因为觉得休息很必要;曾听到一句话是这样说的:“你们得救在乎归回安息;你们得力在乎平静安稳”。当我想到太阳没秒钟要燃烧420万吨的燃料时,想到的就是造物主的厚爱与自己的渺小,如果一直忙碌下去,一直觉得自己很了不起,地球缺了我就不转了,那我真的是没救了!
这次博客的标题是模块、菜单、按钮;到目前为止还没有创建数据库,所有的模块名称,模块图标以及菜单名称,菜单按钮或是菜单按钮图标都是在代码中来完成定义,先来看下效果:

接口代码定义:
接口代码目前主要是来规范模块和菜单的,贴下代码:

1 /// <summary>
2 /// 定义所有插件属性
3 /// </summary>
4 public interface IPlugin
5 {
6 /// <summary>
7 /// 插件编码
8 /// </summary>
9 string PluginCode { get; }
10 /// <summary>
11 /// 插件名称
12 /// </summary>
13 string PluginName { get; }
14 /// <summary>
15 /// 插件图标
16 /// </summary>
17 string Icon { get; }
18 /// <summary>
19 /// 插件排序
20 /// </summary>
21 int Index { get; }
22 /// <summary>
23 /// 模块列表
24 /// </summary>
25 List<Menus> MenuList { get; }
26 }
模块接口代码

1 public interface IMenu
2 {
3 /// <summary>
4 /// 菜单编码
5 /// </summary>
6 string MenuCode { get; }
7 /// <summary>
8 /// 菜单名称
9 /// </summary>
10 string MenuName { get; }
11 /// <summary>
12 /// 菜单排序
13 /// </summary>
14 int MenuIndex { get; }
15 /// <summary>
16 /// 分组名称
17 /// </summary>
18 string GroupName { get; }
19 /// <summary>
20 /// 分组排序
21 /// </summary>
22 int GroupIndex { get;}
23 /// <summary>
24 /// 菜单实例
25 /// </summary>
26 FrameworkElement Element { get; }
27 /// <summary>
28 /// 菜单按钮
29 /// </summary>
30 List<MenusButton> ButtonList { get; }
31
32 }
菜单接口代码
插件接口实现:
接下来就是接口的实现了,因为我们采用插件化的开发模式,也可以叫做MEF;所以就要在每个插件中来实现接口。目前所有的插件都是以用户控件的模式来创建的,以类库类型输出,然后在启动程序中添加对插件的引用。
每个插件中都有一个实现IPlugin接口的类,是这样实现的:

1 [Export(typeof(IPlugin))]
2 public class SysManagerPlugin: IPlugin
3 {
4 public string PluginCode => "SysManagerPlugin";
5 public string PluginName => "系统管理";
6 public string Icon => "images/Settings.png";
7 public int Index => 1;
8 public List<Menus> MenuList
9 {
10 get
11 {
12 List<Menus> menus = new List<Menus>();
13 var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
14 using (CompositionContainer container = new CompositionContainer(catalog))
15 {
16 var list = container.GetExportedValues<IMenu>();
17 if (null != list && list.Count() > 0)
18 {
19 list.ToList().ForEach(x => {
20 menus.Add(new Menus() { MenuName = x.MenuName, MenuCode = x.MenuCode, MenuIndex = x.MenuIndex, Element = x.Element, GroupName = x.GroupName, GroupIndex = x.GroupIndex, ButtonList = x.ButtonList });
21 });
22 }
23 }
24 return menus;
25 }
26 }
27 }
IPlugin实现
通过代码我们可以看到,在实现接口的时候,就定义了插件所对应模块的名称,模块图标,模块排序以及模块中的菜单列表,菜单列表中的每一项都是以用户控件的形式来创建的,每一个用户控件对应一个菜单内容,每一个菜单所对应的用户控件都实现了IMenu接口,来展示下:

1 [Export(typeof(IMenu))]
2 public partial class UserFrm : UserControl, IMenu
3 {
4 public UserViewModel ViewModel { get; set; }
5 public UserFrm()
6 {
7 InitializeComponent();
8 ViewModel = new UserViewModel();
9 this.DataContext = ViewModel;
10 this.ButtonArray.ItemsSource = ButtonList;
11 }
12 public string MenuCode => "1001";
13 public string MenuName => "用户管理";
14 public int MenuIndex => 1;
15 public string GroupName => "基础设置";
16 public int GroupIndex => 1;
17 public FrameworkElement Element => new UserFrm();
18 public List<MenusButton> ButtonList => new List<MenusButton>
19 {
20 new MenusButton{ButtonCode="100101",ButtonName="新增",ButtonIndex=1,ButtonIcon=EnumHelper.GetEnumDescription(ButtonIcon.Add),ButtonCommand=ViewModel.AddCommand },
21 new MenusButton{ButtonCode="100103",ButtonName="编辑",ButtonIndex=3,ButtonIcon=EnumHelper.GetEnumDescription(ButtonIcon.Edit) },
22 new MenusButton{ButtonCode="100105",ButtonName="删除",ButtonIndex=5,ButtonIcon=EnumHelper.GetEnumDescription(ButtonIcon.Delete) },
23 };
24 private void dgList_LoadingRow(object sender, DataGridRowEventArgs e)
25 {
26 e.Row.Header = e.Row.GetIndex() + 1;
27 }
28 }
IMenu实现
通过代码我们看到,在实现接口的时候,就定义了菜单编码,菜单名称,菜单所属分组,分组名称以及按钮集合等,在按钮集合中也包含了按钮名称,按钮图标以及按钮对应的命令。最后启动程序在初始化的时候,读取所有插件中定义的模块以及菜单与按钮,接下来提供下目前的项目截图:

以上图片的三个红框标记分别对应的是接口项目、插件项目、启动项目,稍晚的时候,会将今天的代码上传到
QQ群:720369133
对源码有兴趣的小伙伴,欢迎进群,也恳请大家提出宝贵意见!
系列目录:
WPF权限控制——【2】模块、菜单、按钮的更多相关文章
- WPF权限控制——【3】数据库、自定义弹窗、表单验证
你相信"物竞天择,适者生存"这样的学说吗?但是我们今天却在提倡"尊老爱幼,救死扶伤",帮助并救护弱势群体:第二次世界大战期间,希特勒认为自己是优等民族,劣势民族 ...
- WPF权限控制框架——【4】抛砖引玉
写第一篇"权限控制框架"系列博客是在2021-01-29,在这不到一个月的时间里,收集自己零碎的时间,竟然写出了一个"麻雀虽小,五脏俱全"的权限控制框架:对于一 ...
- WPF权限控制——【1】界面布局
本来就不怎么喜欢写博客,好不容易申请了博客园的账号,迈出了先前没有跨越的第一步:转眼间几年的时间就过去了,还是空空如也.今天的心境是这样的,发现wpf相关的资料及源码实在不多,就想写下随笔:一方面是自 ...
- SAAS云平台搭建札记: (三) AntDesign + .Net Core WebAPI权限控制、动态菜单的生成
我们知道,当下最火的前端框架,非蚂蚁金服的AntDesign莫属,这个框架不仅在国内非常有名,在国外GitHub上React前端框架也排名第一.而且这个框架涵盖了React.Vue.Angular等多 ...
- yii2权限控制rbac之菜单menu最详细教程
前面我们在博文 yii2搭建完美后台并实现rbac权限控制实例教程中完美实现了yii2的后台搭建和rbac权限控制,如果你还没有实现,请先看上文再回来参考本文,因为本文是在上文的基础上进行完善和补充. ...
- Spring Cloud实战 | 第十一篇:Spring Cloud Gateway 网关实现对RESTful接口权限控制和按钮权限控制
一. 前言 hi,大家好,这应该是农历年前的关于开源项目 的最后一篇文章了. 有来商城 是基于 Spring Cloud OAuth2 + Spring Cloud Gateway + JWT实现的统 ...
- 基于Vue实现后台系统权限控制
原文地址:http://refined-x.com/2017/08/29/基于Vue实现后台系统权限控制/,转载请注明出处. 用Vue/React这类双向绑定框架做后台系统再适合不过,后台系统相比普通 ...
- Vue + Element UI 实现权限管理系统 前端篇(十三):页面权限控制
权限控制方案 既然是后台权限管理系统,当然少不了权限控制啦,至于权限控制,前端方面当然就是对页面资源的访问和操作控制啦. 前端资源权限主要又分为两个部分,即导航菜单的查看权限和页面增删改操作按钮的操作 ...
- WPF wpf中按钮操作权限控制
权限控制我们有很多种方式可以实现. 这次项目中做个简单的权限控制,我们在所有按钮触发前判断,有权限则可执行. 我们自定义一个命令类. public class DelegateCommand : IC ...
随机推荐
- Hive日期函数总结(转学习使用)
一.时间戳函数 1.获取当前时区的UNIX时间戳:select unix_timestamp(); 2.将指定时间转为UNIX时间戳: select unix_timestamp('2012-03-0 ...
- 杭电1720---A+B Coming(技巧:使用%x)
Problem Description Many classmates said to me that A+B is must needs. If you can't AC this problem, ...
- WPF学习笔记01_XAML之简介
简介 XAML (发音"zammel" 咋么儿),用于实例化.NET对象的标记语言,主要用于构造WPF的用户界面.类似html标记语言. 通过XAML,程序员可以用代码的方式对界面 ...
- 基础Markdown语法
Markdown语法 1.标题 //标题语法 # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题 一级标题 二级标题 三级标题 四级标题 ...
- LeetCode938. 二叉搜索树的范围和
题目 1 class Solution { 2 public: 3 int sum = 0; 4 int rangeSumBST(TreeNode* root, int low, int high) ...
- 华为刘腾:华为终端云Cassandra运维实践分享
点击此处观看完整活动视频 各位线上的嘉宾朋友大家好,我是来自华为消费者BG云服务部的刘腾,我今天给大家分享的主题是华为终端云Cassandra运维实践.和前面王峰老师提到的Cassandra在360中 ...
- Sentry(v20.12.1) K8S 云原生架构探索,JavaScript 性能监控之采样 Transactions
系列 Sentry-Go SDK 中文实践指南 一起来刷 Sentry For Go 官方文档之 Enriching Events Snuba:Sentry 新的搜索基础设施(基于 ClickHous ...
- Jenkins 部署打包文件 并通过SSH上传到 linux服务器
编译 发布 打包成zip文件 dotnet clean : dotnet的命令清除解决方案 dotnet build : dotnet的命令重新生成 dotnet publish .\Hy.MyDem ...
- 5V 升压 8.4V,5V 转 8.4V 做两节锂电池充电芯片
5V 升压 8.4V SOT23-6 封装的六脚升压 IC PW5300 是一颗 DC-DC 异步整流升压转换器芯片,输入电压范围 2.6V-5.5V.最高输出 电压 12V, PW5300 是一种电 ...
- 02_Python基础
2.1 第一条编程语句 print("Hello, Python!") print("To be, or not to be, it's a question." ...