经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 软件/图像 » unity » 查看文章
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(9) -- 实现系统动态菜单的配置和权限分配
来源:cnblogs  作者:伍华聪  时间:2023/10/17 11:02:05  对本文有异议

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

1、系统菜单的管理

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

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

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

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

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

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

  1. string filePath = Assembly.GetExecutingAssembly().GetName().Name;//默认为当前程序集
  2. string dllFullPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, filePath);
  3. var tempAssembly = Assembly.LoadFrom(dllFullPath);
  4. if (tempAssembly != null)
  5. {
  6. //wpfTypeName = 我们配置的反射类名称
  7. Type objType = tempAssembly.GetType(wpfTypeName);
  8. return objType;
  9. }

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

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

 

2、分配角色权限

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

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

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

  1. /// <summary>
  2. /// 获取远程的菜单列表
  3. /// </summary>
  4. /// <returns></returns>
  5. public async Task GetRemoteMenus()
  6. {
  7. //配置使用动态菜单
  8. if (this.UseRemoteMenus)
  9. {
  10. var menuList = await BLLFactory<IMenuService>.Instance.GetMenuNodesByUser(this.UserInfo.Id, this.SystemType);
  11. if (menuList.Count == 0) return;
  12. this.NavigationItems.Clear();
  13. var menuItems = AddMenuItem(menuList);
  14. foreach (var item in menuItems)
  15. {
  16. this.NavigationItems.Add(item);
  17. }
  18. }
  19. }

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

  1. <ui:NavigationView
  2. x:Name="RootNavigation"
  3. Grid.Row="1"
  4. Padding="20,0,42,0"
  5. BreadcrumbBar="{Binding ElementName=BreadcrumbBar}"
  6. FooterMenuItemsSource="{Binding ViewModel.NavigationFooter, Mode=OneWay}"
  7. IsBackButtonVisible="Visible"
  8. IsPaneToggleVisible="True"
  9. MenuItemsSource="{Binding ViewModel.NavigationItems, Mode=OneWay}"
  10. Navigated="RootNavigation_Navigated"
  11. OpenPaneLength="210"
  12. PaneClosed="NavigationView_OnPaneClosed"
  13. PaneDisplayMode="Left"
  14. PaneOpened="NavigationView_OnPaneOpened"
  15. SelectionChanged="OnNavigationSelectionChanged">

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

 

原文链接:https://www.cnblogs.com/wuhuacong/p/17769056.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号