首页 > 其他分享 >循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(9) -- 实现系统动态菜单的配置和权限分配

循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(9) -- 实现系统动态菜单的配置和权限分配

时间:2023-10-17 11:16:23浏览次数:41  
标签:CommunityToolkit Mvvm -- 系统 菜单 所示 WPF 权限 动态

在WPF应用端开发,它的界面类似于Winform端,因此我们也需要对系统的菜单进行动态配置,这样才能把系统的功能弹性发挥到极致,通过动态菜单的配置方式,我们可以很容易的为系统新增所需的功能,通过权限分配的方式,可以更有效的管理系统的菜单分配到不同的角色用户,本篇随笔介绍在WPF应用端中实现系统动态菜单的配置和权限分配。

1、系统菜单的管理

为了能够动态的加载应用系统的菜单,我们需要在数据库中存储对应的菜单信息,配置好后进行权限分配即可。

菜单的管理界面如下所示,左侧是一个菜单的树形列表,用来指引选择或者查询特定的菜单,右侧列表列出菜单的相关信息,以及提供新增、编辑、导入、导出、删除等操作入口。

由于菜单的信息,是会在系统中打开指定的页面的,因此需要配置一个供反射方式读取的页面对象,如下所示。

 这个WPF窗体类型,也是类似Winform端,用于打开WInform窗体的对象全名,这个是WPF页面的全名,用于我们能够在反射处理中迅速定位到具体的类型,然后打开页面使用的。

系统具体的菜单展示效果如下所示。

单击打开系统菜单项目的时候,会根据相关的设置反射对应的WPF页面类,如下代码所示。

    string filePath = Assembly.GetExecutingAssembly().GetName().Name;//默认为当前程序集
    string dllFullPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, filePath);

    var tempAssembly = Assembly.LoadFrom(dllFullPath);
    if (tempAssembly != null)
    {
        //wpfTypeName = 我们配置的反射类名称
        Type objType = tempAssembly.GetType(wpfTypeName);
        return objType;
    }

另外图标的选择,也是根据系统的需要进行选择的。

创建一个图标选择的页面,如下所示,供系统图标选择使用。

 

2、分配角色权限

 完成菜单的信息录入后,我们需要对菜单的访问权限进行设置,根据角色分配权限是最广泛使用的方式,如下界面所示。

角色包含的菜单,用户登录系统后,根据用户的角色身份获取对应的菜单即可,然后在系统中进行展示即可。

 如系统根据身份信息,动态获取服务端的菜单如下所示。

/// <summary>
/// 获取远程的菜单列表
/// </summary>
/// <returns></returns>
public async Task GetRemoteMenus()
{
    //配置使用动态菜单
    if (this.UseRemoteMenus)
    {
        var menuList = await BLLFactory<IMenuService>.Instance.GetMenuNodesByUser(this.UserInfo.Id, this.SystemType);
        if (menuList.Count == 0) return;

        this.NavigationItems.Clear();

        var menuItems = AddMenuItem(menuList);
        foreach (var item in menuItems)
        {
            this.NavigationItems.Add(item);
        }
    }
}

由于程序主窗口里面绑定的菜单信息,如下代码所示。

<ui:NavigationView
    x:Name="RootNavigation"
    Grid.Row="1"
    Padding="20,0,42,0"
    BreadcrumbBar="{Binding ElementName=BreadcrumbBar}"
    FooterMenuItemsSource="{Binding ViewModel.NavigationFooter, Mode=OneWay}"
    IsBackButtonVisible="Visible"
    IsPaneToggleVisible="True"
    MenuItemsSource="{Binding ViewModel.NavigationItems, Mode=OneWay}"
    Navigated="RootNavigation_Navigated"
    OpenPaneLength="210"
    PaneClosed="NavigationView_OnPaneClosed"
    PaneDisplayMode="Left"
    PaneOpened="NavigationView_OnPaneOpened"
    SelectionChanged="OnNavigationSelectionChanged">

因此系统菜单就可以正常的更新为动态配置的菜单信息了。

 

标签:CommunityToolkit,Mvvm,--,系统,菜单,所示,WPF,权限,动态
From: https://www.cnblogs.com/wuhuacong/p/17769056.html

相关文章

  • TLS/SSL 协议 - ClientHello
    ClientHello在一次新的握手流程中,ClientHello消息总是第一条消息。这条消息将客户端的功能和首选项传送给服务器。客户端会在新建连接后,希望重新协商或者响应服务器发起的重新协商请求(由HelloRequest消息指示)时,发送这条消息。Wireshark抓取ClientHello消息:Version协议版......
  • VS2019连接MySql使用实体数据模型(EF实体映射)【解决创建闪退问题】
    一、确定MySQLConnectorNet版本如果没有请下载下载驱动:mysql-connector-odbc-8.0.20-winx64.msimysqlodbc驱动mysql-for-visualstudio-1.2.9.msiVisualStudio连接MySQL工具mysql-connector-net-8.0.20.msimysql数据库.net开发驱动驱动介绍1.MySQLConnector/ODBC ......
  • 按月份对目录进行打包
     #子目录按年月日命令,对每个月的子目录进行打包y='2023'#定义年份formin{01..12};do#定义01到12月ym="$y$m"echo$ymifls$ym*&>/dev/null;then#检查月份文件夹是否存在echo"$ym*exists,starttotar..."tar-cf$ym.tar$ym*else......
  • 分享几条Linux怎么做安全防范措施的方法
    在Linux系统中,可以采取以下安全防范措施: *保持操作系统最新状态。及时更新操作系统可以减少安全风险,因为黑客经常利用操作系统漏洞进行攻击。此外,最新的操作系统版本通常包含更多的安全功能和改进,能够更好地抵御攻击。*禁用不必要的服务。默认情况下,Linux服务器可能会启用许......
  • OpenHarmony 踩坑2
    接下来要记录的是代码层面的细节问题:1、读取文件,每个文本文件不能超过128k,直接会报:Stackoverflow 2、读取的json文件不能为空,代码会停掉,最起码要有[] 3、加载动态图片,需要先将图片读入内存转成base64,再使用Image组件进行渲染 4、鼠标上浮图片放大,会对其他元......
  • 易基因:细菌微生物基因表达调控表观研究方案|原核三代甲基化+转录组
    1、原核甲基化原核生物中的DNA甲基化原核生物甲基化为什么基于三代测序?第三代DNA测序为原核细菌的甲基化和表观遗传的研究开辟了一条新的途径,能够在基因组的水平上获取整个表观遗传的序列信息,绘制全基因组甲基化组。细菌中DNA甲基化研究意义MatthewJ.Blow等人通过......
  • DHorse v1.4.2 发布,基于 k8s 的发布平台
    版本说明优化特性在集群列表增加集群版本;修改Jvm的GC指标名;解决问题解决shell脚本换行符的问题;解决部署历史列表页,环境名展示错误的问题;解决指标收集功能的异常;升级指南升级指南DHorse介绍DHorse是一个简单易用的轻量级的云应用管理平台,不需要理解容器和k8s的概念,......
  • 如何使用GaussDB(DWS)的本地临时表进行数据处理
    本文分享自华为云社区《GaussDB(DWS)临时表系列-本地临时表》,作者:acydy。GaussDB(DWS)从8.2.1版本后支持三种形式的临时表:本地临时表、Volatile临时表、全局临时表。本文先介绍DWS的本地临时表功能。本地临时表特点:表定义和数据都是会话相关,其他会话看不到本会话创建的本地......
  • Dos命令
    Dos命令打开CMD的方式开始+系统+命令提示符Windows键+R输入cmd打开控制台在任意的文件夹下面,按住Shift键+鼠标右键点击在此处打开命令行窗口资源管理器的地址栏前面加上cmd路径常用的Dos命令#盘符切换:英文+:回车#查看当前目录下的所有文件dir回车#切换目录cd#cd......
  • Bug是如何产生的?
    前言知乎上有一个提问:Bug是如何产生的?↓↓↓今天,我们就这个话题,一起来做个讨论。个人觉得程序员与BUG的关系,就像空气中的细菌与人的关系一样。我们不能完全杜绝与它接触,唯一能做的,就是提高我们自身的”免疫力“(俗称可用性或健壮性),让它尽可能的远离我们,影响不了我们。......