周末沒有作業,沒有寫博客,因為覺得休息很必要;曾聽到一句話是這樣說的:“你們得救在乎歸回安息;你們得力在乎平靜安穩”,當我想到太陽沒秒鐘要燃燒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】界面布局
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/255799.html
標籤:WPF

