前文git
項目開源地址(非正式版,開發版本), 碼雲Gitee地址: https://gitee.com/zhgg666/publicWpfgithub
XAML數據庫
XAML能幫助團隊真正實現UI與邏輯的剝離。XAML是一種單純的聲明語言,也就是說,它只能用來聲明一些UI元素 ,繪製UI和動畫,根本沒法在其中加入程序邏輯,這就強制地把邏輯代碼從UI代碼分離開。這樣,與UI相關的元素所有集中在程序的UI層,與邏輯相關的代碼所有集中在邏輯層,造成一種'高內聚-低耦合'的結構。架構
介紹app
該框架, 囊括基礎的用戶管理、角色管理、菜單管理、字典管理、日誌管理, 本篇文章主要介紹現階段開源的ZFS框架Beta1.0的主要的特性框架
設計理念ide
該框架採用的是WPF MVVM架構, 遵循了WPF的數據驅動理念, 與傳統的winform相比較, 事件驅動帶來的各類強耦合, WPF展示了很是強大的優點, 再結合開源組件的 MaterialDesign 的風格, 使得在總體的UI元素, 過分動畫工具
,與第三方的組件相比, 很是小的容量, 提供源代碼,能夠自行進行刪減修改自定義。MaterialDesign 演示:開發工具
MVVM上下文基類接口:動畫
該接口主要應用於關聯 ViewModel 與 Xaml 頁面的 DataContext 上下文對象。
/// <summary> /// 主窗口接口 /// </summary> public interface IModel { /// <summary> /// 關聯數據上下文 /// </summary> /// <typeparam name="TViewModel"></typeparam> /// <param name="viewModel"></param> void BindViewModel<TViewModel>(TViewModel viewModel) where TViewModel : ViewModelBase; /// <summary> /// 關聯數據上下文(默認) /// </summary> void BindDefaultViewModel(int? authValue); /// <summary> /// 獲取主窗口 /// </summary> /// <returns></returns> UserControl GetView(); }
/// <summary> /// 彈窗接口 /// </summary> public interface IModelDialog { /// <summary> /// 關聯數據上下文 /// </summary> /// <typeparam name="TViewModel"></typeparam> /// <param name="viewModel"></param> void BindViewModel<TViewModel>(TViewModel viewModel) where TViewModel : ViewModelBase; /// <summary> /// 彈出窗口 /// </summary> bool? ShowDialog(); /// <summary> /// 關閉窗口 /// </summary> void Close(); }
演示登陸接口的實現(繼承與IModelDialog接口)
/// <summary> /// 登陸窗口 /// </summary> public class LoginViewDlg : ILoginDialog { private Login view; private LoginViewModel loginViewModel; /// <summary> /// 綁定指定ViewModel /// </summary> /// <typeparam name="TViewModel"></typeparam> /// <param name="viewModel"></param> public void BindViewModel<TViewModel>(TViewModel viewModel) where TViewModel : ViewModelBase { this.GetDialog().DataContext = viewModel; } /// <summary> /// 關閉窗口 /// </summary> public void Close() { this.GetDialog().Close(); } /// <summary> /// 打開窗口 /// </summary> /// <returns></returns> public bool? ShowDialog() { return this.GetDialog().ShowDialog(); } /// <summary> /// 獲取窗口 /// </summary> /// <returns></returns> public Login GetDialog() { if (view == null) { view = new Login(); } return view; } }
調用代碼
//登錄窗口 var Dialog = ServiceProvider.Instance.Get<ILoginDialog>(); Dialog.BindViewModel(new LoginViewModel()); Dialog.ShowDialog();
注:該項目,用到了Unity容器, 因此下載項目的朋友,能在App.xaml詳細中看到了項目中看到一個接口註冊類
/// <summary> /// Unity接口注入類 /// </summary> class BootStrapper { /// <summary> /// 註冊方法 /// </summary> public static void Initialize() { ServiceProvider.RegisterServiceLocator(new UnityServiceLocator()); ServiceProvider.Instance.Register<ILoginDialog, LoginViewDlg>();//用戶登陸接口 ServiceProvider.Instance.Register<IUserDialog, UserViewDlg>();//用戶彈窗接口 ServiceProvider.Instance.Register<IGroupDialog, GroupViewDlg>();//用戶組處理接口 ServiceProvider.Instance.Register<ISkinDialog, SkinViewDlg>();//皮膚設置接口 ServiceProvider.Instance.Register<IMainViewDialog, MainViewDlg>();//首頁窗口 ServiceProvider.Instance.Register<IMsgDialog, MsgViewDlg>();//消息處理接口 } }
MVVM底層操做基類:
1 /// <summary> 2 ///父功能操做基類 3 /// </summary> 4 public class BaseOperation : ViewModelBase, IDataOperation, IPermission 5 { 6 #region 屬性 7 8 private object currentRow; 9 private string searchText = string.Empty; 10 private ObservableCollection<ToolBarDefault> buttonDefaults; 11 12 /// <summary> 13 /// 搜索內容 14 /// </summary> 15 public string SearchText 16 { 17 get { return searchText; } 18 set { searchText = value; RaisePropertyChanged(); } 19 } 20 21 /// <summary> 22 /// 功能集合 23 /// </summary> 24 public ObservableCollection<ToolBarDefault> ButtonDefaults 25 { 26 get { return buttonDefaults; } 27 set { buttonDefaults = value; RaisePropertyChanged(); } 28 } 29 30 /// <summary> 31 /// 當前所選擇行數據 32 /// </summary> 33 public object CurrentRow 34 { 35 get { return currentRow; } 36 set { currentRow = value; RaisePropertyChanged(); } 37 } 38 39 #endregion 40 41 #region 默認實現 42 43 /// <summary> 44 /// 初始化 45 /// </summary> 46 public virtual void InitViewModel() 47 { 48 this.SetDefaultButton(); 49 this.SetButtonAuth(); 50 } 51 52 /// <summary> 53 /// 設置默認按鈕 54 /// </summary> 55 protected virtual void SetDefaultButton() 56 { 57 ButtonDefaults = new ObservableCollection<ToolBarDefault>(); 58 ButtonDefaults.Add(new ToolBarDefault() { AuthValue = Authority.ADD, ModuleName = "新增", Command = this.AddCommand }); 59 ButtonDefaults.Add(new ToolBarDefault() { AuthValue = Authority.EDIT, ModuleName = "編輯", Command = this.EditCommand }); 60 ButtonDefaults.Add(new ToolBarDefault() { AuthValue = Authority.DELETE, ModuleName = "刪除", Command = this.DelCommand }); 61 } 62 63 #endregion 64 65 #region 功能命令 66 67 private RelayCommand _addCommand; 68 private RelayCommand _editCommand; 69 private RelayCommand _delCommand; 70 private RelayCommand _queryCommand; 71 private RelayCommand _resetCommand; 72 73 /// <summary> 74 /// 新增 75 /// </summary> 76 public RelayCommand AddCommand 77 { 78 get 79 { 80 if (_addCommand == null) 81 { 82 _addCommand = new RelayCommand(() => Add()); 83 } 84 return _addCommand; 85 } 86 set { _addCommand = value; } 87 } 88 89 /// <summary> 90 /// 編輯 91 /// </summary> 92 public RelayCommand EditCommand 93 { 94 get 95 { 96 if (_editCommand == null) 97 { 98 _editCommand = new RelayCommand(() => Edit()); 99 } 100 return _editCommand; 101 } 102 set { _editCommand = value; } 103 } 104 105 /// <summary> 106 /// 刪除 107 /// </summary> 108 public RelayCommand DelCommand 109 { 110 get 111 { 112 if (_delCommand == null) 113 { 114 _delCommand = new RelayCommand(() => Del()); 115 } 116 return _delCommand; 117 } 118 set { _delCommand = value; } 119 } 120 121 /// <summary> 122 /// 查詢 123 /// </summary> 124 public RelayCommand QueryCommand 125 { 126 get 127 { 128 if (_queryCommand == null) 129 { 130 _queryCommand = new RelayCommand(() => Query()); 131 } 132 return _queryCommand; 133 } 134 set { _queryCommand = value; } 135 } 136 137 /// <summary> 138 /// 重置 139 /// </summary> 140 public RelayCommand ResetCommand 141 { 142 get 143 { 144 if (_resetCommand == null) 145 { 146 _resetCommand = new RelayCommand(() => Reset()); 147 } 148 return _resetCommand; 149 } 150 set { _resetCommand = value; } 151 } 152 153 154 155 #endregion 156 157 #region IDataOperation接口 158 159 /// <summary> 160 /// 新增 161 /// </summary> 162 public virtual void Add() 163 { 164 } 165 166 /// <summary> 167 /// 編輯 168 /// </summary> 169 public virtual void Edit() 170 { 171 } 172 173 /// <summary> 174 /// 刪除 175 /// </summary> 176 public virtual void Del() 177 { 178 } 179 180 /// <summary> 181 /// 查詢 182 /// </summary> 183 public virtual void Query() 184 { 185 } 186 187 /// <summary> 188 /// 重置 189 /// </summary> 190 public virtual void Reset() 191 { 192 this.SearchText = string.Empty; 193 } 194 195 #endregion 196 197 #region IPermission接口 198 199 protected int? authValue; 200 201 /// <summary> 202 /// 權限值 203 /// </summary> 204 public int? AuthValue { get { return authValue; } set { authValue = value; } } 205 206 /// <summary> 207 /// 驗證按鈕權限 208 /// </summary> 209 /// <param name="authValue"></param> 210 /// <returns></returns> 211 public virtual bool GetButtonAuth(int authValue) 212 { 213 var def = ButtonDefaults.FirstOrDefault(t => (authValue & t.AuthValue) == t.AuthValue && t.IsVisibility.Equals(false)); 214 215 if (def != null) 216 return true; 217 else 218 return false; 219 } 220 221 /// <summary> 222 /// 設置權限 223 /// </summary> 224 public virtual void SetButtonAuth() 225 { 226 if (Loginer.LoginerUser.IsAdmin) return; 227 228 foreach (var b in ButtonDefaults) 229 if ((this.AuthValue & b.AuthValue) != b.AuthValue) 230 b.IsVisibility = true; //隱藏功能 231 } 232 233 #endregion 234 }
MVVM實現的結構圖示例 :
界面演示
設計:
整套系統, 採用的開源UI組件MaterialDesign , 界面風格元素統1、動畫風格遵循框架設計。
MaterialDesign介紹:
官網地址:http://materialdesigninxaml.net/
gitHub地址:https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit
模塊/皮膚:
權限管理:
注:
1.但願支持的朋友點擊Star關注項目, 關注本人博客 ,長期更新。
2.須要數據庫腳本(運行必要文件) 請添加惟一交流QQ 羣 : 874752819
3.開發工具: VS2017 + MSSQL2012
掃碼加入: