热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WPF项目学习.一

WPF项目搭建版权声明:本文为博主初学经验,未经博主允许不得转载。一、前言记录在学习与制作WPF过程中遇到的解决方案。使用MVVM的优点是数据和视图分离,双向绑定,低耦合,可重用行

WPF项目搭建

版权声明:本文为博主初学经验,未经博主允许不得转载。

一、前言

   记录在学习与制作WPF过程中遇到的解决方案。

   使用MVVM的优点是 数据和视图分离,双向绑定,低耦合,可重用行,相对独立的设计和逻辑;

 

二、配置

系统环境:win10

开发工具:Visual Studio 2017

开发语言:C#.WPF (MVVM框架)

数据库:SQLiteStudio

 

三、附件

  • vs_enterprise.exe   在线安装 Visual Studio 2017 开发工具;
  • SQLiteStudio.zip     免安装Sqlite轻量数据库操作工具;
  • WPF-MVVM-Work.zip 项目源代码;

四、步骤

  1. 创建项目;

    

  2. 文件夹层级;

    建文件夹:Model,ViewModel,View,Resources,Lib,Service,Common;

    Model是模型层,属性类存放的地方;也就是存放不涉及业务逻辑的代码;

      例如:列表元素,接口参数,枚举,数据交互的参数模型和View基础元素属性等等;

    ViewMode是视图模型层,是MVVM实现业务逻辑代码的地方;

      例如:操作视图界面数据的呈现,界面按钮触发的事件和操作数据库前后对界面交互的事件;

    View是视图层,是窗体布局实现的地方;也就是呈现给用户交互使用的界面窗体;

      例如:登录页面,查询页面,新增和编辑的页面等;

    Resources是资源库层,里面存放声音,图片和样式布局等统一调用外部资源的地方;

    Lib是引用层,放置一些第三方引用便于调用,也可以用nuget统一管理第三方dll;

    Service是服务层,是实现对数据库或者对站点接口的操作,进行数据持久化和数据交互;

    Common是工具层,是存放一些公共的代码,统一调用,简洁业务逻辑代码的冗余;

    注:可以建文件夹,但更推荐新建类库放置以上层级;

    

  3. 控件的使用与布局;

    3.1 从工具箱中直接拖拉控件;

      

    3.2 直接在代码中编辑控件代码;

      

  4. 代码关联;

    4.1 View与ViewModel的交互关联:

      - View后台的代码关联

     public MainWindow() //类名
        {
            InitializeComponent();
            DataContext = new MainWindowViewModel();//后台代码有这句就实现了View和ViewModel的绑定
     }

 

      - 文本的绑定 

     前端:"{Binding TxtInput}"/>
     后端:

        public string TxtInput
        {
          get => _txtInput;
          set
          {
            _txtInput = value;
            RaisePropertyChanged("TxtInput"); //用于刷新绑定的输入框
          }
        }

        private string _txtInput;

 

      - 事件的绑定

     前端:

        public MainWindowViewModel() 
        {
          BtnAddCOntent= new RelayCommand(AddContent);
        }

        public RelayCommand BtnAddContent { get; set; }

        private void AddContent()
        {
           //按钮事件处理的业务逻辑代码
        }

 

      - 样式的绑定

      "{StaticResource TxbTrigger}" Tag="序号..." />

      

”TxbTrigger是输入框水印样式资源,DefaultButton是按钮样式资源模板;详细样式代码,查阅源码中的Resources-Style;“

    4.2 数据绑定和命令绑定的代码

  public class ViewModelBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        protected void RaisePropertyChanged(Expression> action)
        {
            var propertyName = GetPropertyName(action);
            RaisePropertyChanged(propertyName);
        }
        private static string GetPropertyName(Expression> action)
        {
            var expression = (MemberExpression)action.Body;
            var propertyName = expression.Member.Name;
            return propertyName;
        }
        public void RaisePropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
  public class RelayCommand : ICommand
    {
        public Action ExecuteAction; //执行方法
        public Action<object> ExecuteCommand; //执行方法 带参数
        public Func<object, bool> CanExecuteCommand; //执行方法的条件
        public RelayCommand(Action action)// 执行事件
        {
            ExecuteAction = action;
        }
        public RelayCommand(Action<object> action)// 执行带参数的事件
        {
            ExecuteCommand = action;
        }
        public RelayCommand(Action<object> action, Func<object, bool> can)// 根据条件执行带参数的事件
        {
            ExecuteCommand = action;
            CanExecuteCommand = can;
        }
        public event EventHandler CanExecuteChanged;// 当命令可执行状态发生改变时,应当被激发
        public bool CanExecute(object parameter)// 用于判断命令是否可以执行
        {
            if (ExecuteAction != null) return true;
            return CanExecuteCommand == null || CanExecuteCommand(parameter);
        }
        public void Execute(object parameter)//命令执行
        {
            if (ExecuteCommand != null) ExecuteCommand(parameter);
            else ExecuteAction();
        }
    }

ViewModel的业务类需要继承ViewModelBase

  public class MainWindowViewModel : ViewModelBase

前端的DataGrid绑定的数据需要用ObservableCollection类型定义列表;

     public ObservableCollection AddContent
        {
            get => _addContent;
            set
            {
                _addContent = value;
                RaisePropertyChanged("AddContent"); 
            }
        }

        private ObservableCollection _addCOntent= new ObservableCollection();

"AddModel"是Model中的属性类;代表DataGrid中绑定的列名指向;

DataGrid前端代码:

"False" x:Name="DgTimes" ItemsSource="{Binding AddContent}" 
          SelectedItem="{Binding SelectTime,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
            
                "LeftDoubleClick" Command="{Binding DgDoubleClick}" 
                              CommandParameter="{Binding ElementName=DgTimes, Path=SelectedItem}" />
                "LeftClick" Command="{Binding DgClick}"
                              CommandParameter="{Binding ElementName=DgTimes, Path=SelectedItem}"/>
            
            
                "序号" Binding="{Binding RowIndex}"/>
                "勾选?" Min30">
                    
                        
                            
                                20" 20" Source="{Binding Photo}"/>
                            
                        
                    
                
                "输入内容" Binding="{Binding AddContent}"/>
                "时间" Binding="{Binding AddTime}"/>
            
        

 

  5. 执行效果;

 

五、注意事项

本次项目制作并没有使用数据库的操作;源代码中也是没有!

源码中包括了对输入框限制数字的输入方法;

源码中包括了Button,TextBox,CheckBox,DataGrid等等样式资源代码;

有些网友推荐 MVVMLight 或者 Prism 等第三方MVVM框架引用;

 

WPF做动画效果会很耗电脑资源,并且不会有性能优化;
WPF使用异步的时候注意回到前端主线程才可以调用前端属性;
MVVM只是推荐使用,要结合业务需求灵活变动使用,不是硬性规范;
使用第三方控件和自定义属性会导致开发时界面灰掉;(暂时没找到解决方案)
DataGrid加载不明确的图片,会加载超级慢;DataGrid默认开启数据虚化,会导致滚动条加载慢;

 

 

 


推荐阅读
  • 利用存储过程构建年度日历表的详细指南
    本文将介绍如何使用SQL存储过程创建一个完整的年度日历表。通过实例演示,帮助读者掌握存储过程的应用技巧,并提供详细的代码解析和执行步骤。 ... [详细]
  • 在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 本文详细介绍了如何解决Uploadify插件在Internet Explorer(IE)9和10版本中遇到的点击失效及JQuery运行时错误问题。通过修改相关JavaScript代码,确保上传功能在不同浏览器环境中的一致性和稳定性。 ... [详细]
  • 本文介绍了如何利用JavaScript或jQuery来判断网页中的文本框是否处于焦点状态,以及如何检测鼠标是否悬停在指定的HTML元素上。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 使用C#开发SQL Server存储过程的指南
    本文介绍如何利用C#在SQL Server中创建存储过程,涵盖背景、步骤和应用场景,旨在帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 本文详细介绍了如何在 Linux 平台上安装和配置 PostgreSQL 数据库。通过访问官方资源并遵循特定的操作步骤,用户可以在不同发行版(如 Ubuntu 和 Red Hat)上顺利完成 PostgreSQL 的安装。 ... [详细]
  • IT项目管理过程中的方法、工具、技术
    工欲善其事,必先利其器。而对于一个软件开发项目,最重要的器就是方法,工具和技术。而这三要素中重要的又是方法论,方法是基础&# ... [详细]
author-avatar
秘色瓷2502891691
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有