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     }
IPlugin實現

通過代碼我們可以看到,在實現接口的時候,就定義了插件所對應模塊的名稱,模塊圖標,模塊排序以及模塊中的菜單列表,菜單列表中的每一項都是以用戶控件的形式來創建的,每一個用戶控件對應一個菜單內容,每一個菜單所對應的用戶控件都實現了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】界面布局


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM