WPF框架ZFS

前文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上下文基類接口:動畫

該接口主要應用於關聯 ViewModelXaml 頁面的 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     }
View Code

 

MVVM實現的結構圖示例 :

 

界面演示

 

 

 

設計: 

整套系統, 採用的開源UI組件MaterialDesign , 界面風格元素統1、動畫風格遵循框架設計。

MaterialDesign介紹:

官網地址:http://materialdesigninxaml.net/

gitHub地址:https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit

 

模塊/皮膚:

 

 權限管理:

 

 

注:

1.但願支持的朋友點擊Star關注項目, 關注本人博客 ,長期更新。

2.須要數據庫腳本(運行必要文件) 請添加惟一交流QQ 羣 : 874752819  

3.開發工具: VS2017  +  MSSQL2012

掃碼加入:

 

相關文章
相關標籤/搜索