在WPF應用端開發,它的界面類似於Winform端,因此我們也需要對系統的菜單進行動態配置,這樣才能把系統的功能彈性發揮到極致,通過動態菜單的配置方式,我們可以很容易的為系統新增所需的功能,通過許可權分配的方式,可以更有效的管理系統的菜單分配到不同的角色用戶,本篇隨筆介紹在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">
因此系統菜單就可以正常的更新為動態配置的菜單信息了。
專註於代碼生成工具、.Net/.NetCore 框架架構及軟體開發,以及各種Vue.js的前端技術應用。著有Winform開發框架/混合式開發框架、微信開發框架、Bootstrap開發框架、ABP開發框架、SqlSugar開發框架等框架產品。
轉載請註明出處:撰寫人:伍華聰 http://www.iqidi.com