zoukankan      html  css  js  c++  java
  • 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

    扫码加入:

     

  • 相关阅读:
    非类型模板参数(针对C++)
    继承(针对C++)
    进程中的线程共享的资源有哪些?
    关键字typename(针对C++)
    设计模式之——工厂模式
    利用多线程同步互斥来创建自己的资源锁
    SQL优化总结
    委托与泛型
    第5章 事件和数据回发机制
    jQuery权威指南_读书笔记
  • 原文地址:https://www.cnblogs.com/zh7791/p/9761935.html
Copyright © 2011-2022 走看看