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 }
通過程式碼我們可以看到,在實現介面的時候,就定義了外掛所對應模組的名稱,模組圖示,模組排序以及模組中的選單列表,選單列表中的每一項都是以使用者控制元件的形式來建立的,每一個使用者控制元件對應一個選單內容,每一個選單所對應的使用者控制元件都實現了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許可權控制——【1】介面佈局