1. 程式人生 > >WPF許可權控制——【2】模組、選單、按鈕

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】介面佈局