循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(1)
在我们的SqlSugar的开发框架中,整合了Winform端、Vue3+ElementPlus的前端、以及基于UniApp+Vue+ThorUI的移动前端几个前端处理,基本上覆盖了我们日常的应用模式了,本篇随笔进一步介绍前端应用的领域,研究集成WPF的应用端,循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发。
1、基于CommunityToolkit.Mvvm开发WPF应用
MVVM是Model-View-ViewModel的简写。类似于目前比较流行的MVC、MVP设计模式,主要目的是为了分离视图(View)和模型(Model)的耦合。
它是一种极度优秀的设计模式,但并非框架级别的东西,由MVP(Model-View-Presenter)模式与WPF结合的应用方式时发展演变过来的一种新型架构。
MVVM模式和MVC模式一样,主要目的是分离视图(View)和模型(Model),有几大优点
1. 低耦合:视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的View上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
2. 可重用性:可以把一些视图逻辑放在一个ViewModel里面,让很多View重用这段视图逻辑。
3. 独立开发:开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xml代码。
4. 可测试:界面素来是比较难于测试的,而现在测试可以针对ViewModel来写。
CommunityToolkit.Mvvm
(又名 MVVM 工具包,以前名为 Microsoft.Toolkit.Mvvm
) 是一个现代、快速且模块化的 MVVM 库。 它是 .NET 社区工具包的一部分,围绕以下原则构建:
- 平台和运行时独立 - .NET Standard 2.0、 .NET Standard 2.1 和 .NET 6 (UI Framework 不可知)
- 易于选取和使用 - 在“MVVM”) 之外,对应用程序结构或编码范例 (没有严格的要求,即灵活使用。
- 点菜 - 自由选择要使用的组件。
- 参考实现 - 精益和性能,为基类库中包含的接口提供实现,但缺少直接使用它们的具体类型。
MVVM 工具包由 Microsoft 维护和发布,是 .NET Foundation 的一部分。 它还由内置于 Windows 中的多个第一方应用程序使用。
此包面向 .NET Standard,因此可在任何应用平台上使用:UWP、WinForms、WPF、Xamarin、Uno 等;和在任何运行时上:.NET Native、.NET Core、.NET Framework或 Mono。 它在所有它们上运行。 API 图面在所有情况下都是相同的,因此非常适合生成共享库。
官网介绍地址:https://learn.microsoft.com/zh-cn/dotnet/communitytoolkit/mvvm/
CommunityToolkit.Mvvm 类型包括如下列表,它的便利之处,主要通过标记式的特性(Attribute)来实现相关的代码的生成,简化了原来的代码。
从版本 8.0 开始,MVVM 工具包包含全新的 Roslyn 源生成器,有助于在使用 MVVM 体系结构编写代码时大幅减少样板。 它们可简化需要设置可观察属性、命令等的方案。
例如对于属性的标注声明
- [ObservableProperty]
- private string? name;
它编译后,自动会生成相关的处理代码。
- private string? name;
- public string? Name
- {
- get => name;
- set => SetProperty(ref name, value);
- }
对于命令的属性标注生成,也是如此。
- [RelayCommand]
- private void SayHello()
- {
- Console.WriteLine("Hello");
- }
它后面编译则会生成下面代码。
- private void SayHello()
- {
- Console.WriteLine("Hello");
- }
- private ICommand? sayHelloCommand;
- public ICommand SayHelloCommand => sayHelloCommand ??= new RelayCommand(SayHello);
这些是我们常规MVVM里面用到的属性和响应函数Command的处理。
在WPF项目的Nugget引用中添加CommunityToolkit.Mvvm的引用包,如下所示。
例如对于MVVM应用中,其中包括Model、View、ViewModel三者内容中,视图ViewModel的类定义如下所示。
- namespace WHC.SugarProject.WpfUI.ViewModels;
- /// <summary>
- /// 简单的视图模型定义类
- /// </summary>
- public partial class DashboardViewModel : ObservableObject
- {
- /// <summary>
- /// MVVM模式的可观测属性
- /// </summary>
- [ObservableProperty]
- private int _counter = 0;
- /// <summary>
- /// 供视图界面调用的Command定义
- /// </summary>
- [RelayCommand]
- private void OnCounterIncrement()
- {
- Counter++;
- }
- }
通过这个属性和命令的声明处理,我们就可以在View视图中进行调用处理了,我们可以看到视图Page页面的代码如下所示。
- <Page
- x:Class="WHC.SugarProject.WpfUI.Views.Pages.DashboardPage"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:local="clr-namespace:WHC.SugarProject.WpfUI.Views.Pages"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
- Title="DashboardPage"
- d:DataContext="{d:DesignInstance local:DashboardPage,
- IsDesignTimeCreatable=False}"
- d:DesignHeight="450"
- d:DesignWidth="800"
- ui:Design.Background="{DynamicResource ApplicationBackgroundBrush}"
- ui:Design.Foreground="{DynamicResource TextFillColorPrimaryBrush}"
- Foreground="{DynamicResource TextFillColorPrimaryBrush}"
- mc:Ignorable="d">
- <Grid VerticalAlignment="Top">
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="Auto" />
- <ColumnDefinition Width="Auto" />
- </Grid.ColumnDefinitions>
- <ui:Button
- Grid.Column="0"
- Command="{Binding ViewModel.CounterIncrementCommand, Mode=OneWay}"
- Content="Click me!"
- Icon="{ui:SymbolIcon Fluent24}" />
- <TextBlock
- Grid.Column="1"
- Margin="12,0,0,0"
- VerticalAlignment="Center"
- Text="{Binding ViewModel.Counter, Mode=OneWay}" />
- </Grid>
- </Page>
我们可以看到,按钮的Button的Command处理,直接就是可以使用MVVM 工具包自动编译生成的属性ViewModel.Counter和命令CounterIncrementCommand了。
可以看到属性名自动变为大写,Public访问权限的,而命令则是我们定义的函数中后缀增加Command。
2、WPF的界面控件包
WPF本身提供了很多原生的控件,也非常强大,可塑性也很好,我们可以通过定义它的样式继承,以及一些模板化的处理,可以实现非常丰富、美观的界面处理效果。另外WPF应用本身我们系统基于一个比较好的界面布局来设置应用,因此在综合了解一些WPF的应用开发包和开源基础框架后,对界面控件部分,采用了HandyControl的控件,而界面布局则参考lepoco/wpfui 的项目进行改进。
HandyControl的控件 的
官方地址:https://github.com/HandyOrg/HandyControl
中文文档地址:https://handyorg.github.io/handycontrol/
它的界面组件提供很好的样式定制,而且是基于原生WPF的进行扩展标注即可。
而lepoco/wpfui 的项目
GitHub地址:https://github.com/lepoco/wpfui
文档地址:https://wpfui.lepo.co/documentation/
它的演示界面效果如下所示。
相对而言,lepoco/wpfui 的项目最为突出的是它的框架部分,虽然也提供了一些UI控件的封装,不过样式都比较普通,而HandyControl的控件则显得更加美观一些,因此我综合两个项目的优点,把它整合一起,结合MVVM的开发模式,实现基于SqlSugar框架的WPF应用端的开发。
SqlSugar的开发框架中WPF应用端的登录界面效果如下。
SqlSugar的开发框架中WPF应用端的字典管理界面效果如下。
批量添加字典项目的界面
新建、编辑字典项目的界面
SqlSugar的开发框架中WPF应用端的系统参数管理界面效果如下。
以上是实现的一些功能模块的界面,具体的功能开发介绍,后续继续分享介绍。
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(1)的更多相关文章
- 基于SqlSugar的开发框架循序渐进介绍(3)-- 实现代码生成工具Database2Sharp的整合开发
我喜欢在一个项目开发模式成熟的时候,使用代码生成工具Database2Sharp来配套相关的代码生成,对于我介绍的基于SqlSugar的开发框架,从整体架构确定下来后,我就着手为它们量身定做相关的代码 ...
- 推荐一个基于Vue2.0的的一款移动端开发的UI框架,特别好用。。。
一丶YDUI 一只注重审美,且性能高效的移动端&微信UI. 下面为地址自己研究去吧! 我的项目正在用,以前用的Mint-ui但是现在感觉还是这个好一点,官方给出的解释很清楚,很实用. 官方地址 ...
- 基于SqlSugar的开发框架循序渐进介绍(4)-- 在数据访问基类中对GUID主键进行自动赋值处理
我们在设计数据库表的时候,往往为了方便,主键ID一般采用字符串类型或者GUID类型,这样对于数据库表记录的迁移非常方便,而且有时候可以在处理关联记录的时候,提前对应的ID值.但有时候进行数据记录插入的 ...
- 基于SqlSugar的开发框架循序渐进介绍(5)-- 在服务层使用接口注入方式实现IOC控制反转
在前面随笔,我们介绍过这个基于SqlSugar的开发框架,我们区分Interface.Modal.Service三个目录来放置不同的内容,其中Modal是SqlSugar的映射实体,Interface ...
- 基于SqlSugar的开发框架循序渐进介绍(6)-- 在基类接口中注入用户身份信息接口
在基于SqlSugar的开发框架中,我们设计了一些系统服务层的基类,在基类中会有很多涉及到相关的数据处理操作的,如果需要跟踪具体是那个用户进行操作的,那么就需要获得当前用户的身份信息,包括在Web A ...
- 基于SqlSugar的开发框架循序渐进介绍(8)-- 在基类函数封装实现用户操作日志记录
在我们对数据进行重要修改调整的时候,往往需要跟踪记录好用户操作日志.一般来说,如对重要表记录的插入.修改.删除都需要记录下来,由于用户操作日志会带来一定的额外消耗,因此我们通过配置的方式来决定记录那些 ...
- 基于SqlSugar的开发框架循序渐进介绍(12)-- 拆分页面模块内容为组件,实现分而治之的处理
在早期的随笔就介绍过,把常规页面的内容拆分为几个不同的组件,如普通的页面,包括列表查询.详细资料查看.新增资料.编辑资料.导入资料等页面场景,这些内容相对比较独立,而有一定的代码量,本篇随笔介绍基于V ...
- 基于SqlSugar的开发框架循序渐进介绍(13)-- 基于ElementPlus的上传组件进行封装,便于项目使用
在我们实际项目开发过程中,往往需要根据实际情况,对组件进行封装,以更简便的在界面代码中使用,在实际的前端应用中,适当的组件封装,可以减少很多重复的界面代码,并且能够非常简便的使用,本篇随笔介绍基于El ...
- 基于SqlSugar的开发框架循序渐进介绍(14)-- 基于Vue3+TypeScript的全局对象的注入和使用
刚完成一些前端项目的开发,腾出精力来总结一些前端开发的技术点,以及继续完善基于SqlSugar的开发框架循序渐进介绍的系列文章,本篇随笔主要介绍一下基于Vue3+TypeScript的全局对象的注入和 ...
- 基于SqlSugar的开发框架循序渐进介绍(17)-- 基于CSRedis实现缓存的处理
在一个应用系统的开发框架中,往往很多地方需要用到缓存的处理,有些地方是为了便于记录用户的数据,有些地方是为了提高系统的响应速度,如有时候我们在发送一个短信验证码的时候,可以在缓存中设置几分钟的过期时间 ...
随机推荐
- docker部署gitlab CI/CD (二)终篇:部署gitlab runner和添加gitlab-ci.yml文件 终极踩坑版
关于gitlab部署的教程还好,有的看,但到了cicd环节,简直痛苦面具,教程虽多,但断断续续,先不说大部分都是只截取片段,让人云里雾里,不会的看不懂,懂的不需要看,根据步骤跑不起来不说,改了一堆,完 ...
- JVM系统参数
JVM(Java虚拟机)是Java程序的运行环境,它可以通过一些系统参数进行配置和优化.以下是一些常用的JVM系统参数: 1. -Xmx: 用于设置JVM堆的最大内存大小.例如,-Xmx1g表示将堆的 ...
- 体验了一把 MiniGPT-4,一言难尽
最近看到一个好玩的开源项目:MiniGPT-4. 看名字像 GPT-4 的小老弟,其实没啥关系. 简单说,它可以识别图像,基于图像你可以和它对话,它能生成图片描述.网站.诗歌. 先看看官方给出的例子截 ...
- zabbix监控服务器php
1 修改php配置文件 /apollo/env/php/thirdparty.php-7.3/etc/php-fpm.conf,添加pm.status pm.status_path = /phpfpm ...
- 使用Docker将Vite Vue项目部署到Nginx二级目录
Vue项目配置 使用Vite创建一个Vue项目,点我查看如何创建 配置打包路径 在Nginx中如果是二级目录,例如/web时,需要设置线上的打包路径 在项目跟路径下创建两个文件:.env.produc ...
- AI隐私保护中的常见隐私隐私问题与解决方案
目录 题目:<AI隐私保护中的常见隐私问题与解决方案> 引言 随着人工智能技术的快速发展,AI隐私保护也成为了一个备受关注的问题.由于AI技术的应用范围越来越广泛,例如语音识别.图像识别. ...
- expected unqualified-id on oneapi tbb12
230628-expected unqualified-id eton@230628 在编译supra基于debian12 Qt5.15 tbb12 libtbb12/stable,now 2021. ...
- python台历代码--涉及知识点为Excel表格合并等操作
from openpyxl.styles import Alignment, PatternFill, Fontfrom openpyxl.utils import get_column_letter ...
- 5.2 基于ROP漏洞挖掘与利用
通常情况下栈溢出可能造成的后果有两种,一类是本地提权另一类则是远程执行任意命令,通常C/C++并没有提供智能化检查用户输入是否合法的功能,同时程序编写人员在编写代码时也很难始终检查栈是否会发生溢出,这 ...
- 【NestJS系列】从Nest CLI开始入门
初识Nest JS Nest 是一个渐进的 Node.js 框架,它可以在 TypeScript 和 JavaScript (ES6.ES7.ES8)之上构建高效.可伸缩的企业级服务器端应用程序. N ...