在WPF應用端開發,它的介面類似於Winform端,因此我們也需要對系統的選單進行動態設定,這樣才能把系統的功能彈性發揮到極致,通過動態選單的設定方式,我們可以很容易的為系統新增所需的功能,通過許可權分配的方式,可以更有效的管理系統的選單分配到不同的角色使用者,本篇隨筆介紹在WPF應用端中實現系統動態選單的設定和許可權分配。
為了能夠動態的載入應用系統的選單,我們需要在資料庫中儲存對應的選單資訊,設定好後進行許可權分配即可。
選單的管理介面如下所示,左側是一個選單的樹形列表,用來指引選擇或者查詢特定的選單,右側列表列出選單的相關資訊,以及提供新增、編輯、匯入、匯出、刪除等操作入口。
由於選單的資訊,是會在系統中開啟指定的頁面的,因此需要設定一個供反射方式讀取的頁面物件,如下所示。
這個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; }
另外圖示的選擇,也是根據系統的需要進行選擇的。
建立一個圖示選擇的頁面,如下所示,供系統圖示選擇使用。
完成選單的資訊錄入後,我們需要對選單的存取許可權進行設定,根據角色分配許可權是最廣泛使用的方式,如下介面所示。
角色包含的選單,使用者登入系統後,根據使用者的角色身份獲取對應的選單即可,然後在系統中進行展示即可。
如系統根據身份資訊,動態獲取伺服器端的選單如下所示。
/// <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">
因此係統選單就可以正常的更新為動態設定的選單資訊了。