Loading

WPF框架ZFS

前文

项目开源地址(非正式版,开发版本), 码云Gitee地址:  https://gitee.com/zhgg666/publicWpf

 

XAML

XAML能帮助团队真正实现UI与逻辑的剥离。XAML是一种单纯的声明语言,也就是说,它只能用来声明一些UI元素 ,绘制UI和动画,根本无法在其中加入程序逻辑,这就强制地把逻辑代码从UI代码分离开。这样,与UI相关的元素全部集中在程序的UI层,与逻辑相关的代码全部集中在逻辑层,形成一种'高内聚-低耦合'的结构。

 

介绍

框架, 囊括基础的用户管理、角色管理、菜单管理、字典管理、日志管理,  本篇文章主要介绍现阶段开源的ZFS框架Beta1.0的主要的特性

 

设计理念

该框架采用的是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 , 界面风格元素统一、动画风格遵循框架设计。

MaterialDesign介绍:

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

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

 

模块/皮肤:

 

 权限管理:

 

 

注:

1.希望支持的朋友点击Star关注项目, 关注本人博客 ,长期更新。

2.需要数据库脚本(运行必要文件) 请添加唯一交流QQ 群 : 874752819  

3.开发工具: VS2017  +  MSSQL2012

扫码加入:

 

posted @ 2018-10-09 18:08  痕迹g  阅读(26443)  评论(13编辑  收藏  举报