在我們的SqlSugar的開發(fā)框架中,整合了Winform端、Vue3+ElementPlus的前端、以及基于UniApp+Vue+ThorUI的移動前端幾個前端處理,基本上覆蓋了我們?nèi)粘5膽?yīng)用模式了,本篇隨筆進(jìn)一步介紹前端應(yīng)用的領(lǐng)域,研究集成WPF的應(yīng)用端,循序漸進(jìn)介紹基于CommunityToolkit.Mvvm 和HandyControl的WPF應(yīng)用端開發(fā)。
1、基于CommunityToolkit.Mvvm開發(fā)WPF應(yīng)用
MVVM是Model-View-ViewModel的簡寫。類似于目前比較流行的MVC、MVP設(shè)計模式,主要目的是為了分離視圖(View)和模型(Model)的耦合。
它是一種極度優(yōu)秀的設(shè)計模式,但并非框架級別的東西,由MVP(Model-View-Presenter)模式與WPF結(jié)合的應(yīng)用方式時發(fā)展演變過來的一種新型架構(gòu)。
?MVVM模式和MVC模式一樣,主要目的是分離視圖(View)和模型(Model),有幾大優(yōu)點
1. 低耦合:視圖(View)可以獨立于Model變化和修改,一個ViewModel可以綁定到不同的View上,當(dāng)View變化的時候Model可以不變,當(dāng)Model變化的時候View也可以不變。
2. 可重用性:可以把一些視圖邏輯放在一個ViewModel里面,讓很多View重用這段視圖邏輯。
3. 獨立開發(fā):開發(fā)人員可以專注于業(yè)務(wù)邏輯和數(shù)據(jù)的開發(fā)(ViewModel),設(shè)計人員可以專注于頁面設(shè)計,使用Expression Blend可以很容易設(shè)計界面并生成xml代碼。
4. 可測試:界面素來是比較難于測試的,而現(xiàn)在測試可以針對ViewModel來寫。
CommunityToolkit.Mvvm?
?(又名 MVVM 工具包,以前名為?Microsoft.Toolkit.Mvvm
) 是一個現(xiàn)代、快速且模塊化的 MVVM 庫。 它是 .NET 社區(qū)工具包的一部分,圍繞以下原則構(gòu)建:
- 平臺和運(yùn)行時獨立?-?.NET Standard 2.0、?.NET Standard 2.1?和?.NET 6?? (UI Framework 不可知)
- 易于選取和使用?- 在“MVVM”) 之外,對應(yīng)用程序結(jié)構(gòu)或編碼范例 (沒有嚴(yán)格的要求,即靈活使用。
- 點菜?- 自由選擇要使用的組件。
- 參考實現(xiàn)?- 精益和性能,為基類庫中包含的接口提供實現(xiàn),但缺少直接使用它們的具體類型。
MVVM 工具包由 Microsoft 維護(hù)和發(fā)布,是 .NET Foundation 的一部分。 它還由內(nèi)置于 Windows 中的多個第一方應(yīng)用程序使用。
此包面向?.NET Standard,因此可在任何應(yīng)用平臺上使用:UWP、WinForms、WPF、Xamarin、Uno 等;和在任何運(yùn)行時上:.NET Native、.NET Core、.NET Framework或 Mono。 它在所有它們上運(yùn)行。 API 圖面在所有情況下都是相同的,因此非常適合生成共享庫。
官網(wǎng)介紹地址:https://learn.microsoft.com/zh-cn/dotnet/communitytoolkit/mvvm/?
CommunityToolkit.Mvvm?類型包括如下列表,它的便利之處,主要通過標(biāo)記式的特性(Attribute)來實現(xiàn)相關(guān)的代碼的生成,簡化了原來的代碼。
?
從版本 8.0 開始,MVVM 工具包包含全新的 Roslyn 源生成器,有助于在使用 MVVM 體系結(jié)構(gòu)編寫代碼時大幅減少樣板。 它們可簡化需要設(shè)置可觀察屬性、命令等的方案。
?例如對于屬性的標(biāo)注聲明
[ObservableProperty] private string? name;
它編譯后,自動會生成相關(guān)的處理代碼。
private string? name; public string? Name { get => name; set => SetProperty(ref name, value); }
對于命令的屬性標(biāo)注生成,也是如此。
[RelayCommand] private void SayHello() { Console.WriteLine("Hello"); }
它后面編譯則會生成下面代碼。
private void SayHello() { Console.WriteLine("Hello"); } private ICommand? sayHelloCommand; public ICommand SayHelloCommand => sayHelloCommand ??= new RelayCommand(SayHello);
這些是我們常規(guī)MVVM里面用到的屬性和響應(yīng)函數(shù)Command的處理。
在WPF項目的Nugget引用中添加CommunityToolkit.Mvvm的引用包,如下所示。
?例如對于MVVM應(yīng)用中,其中包括Model、View、ViewModel三者內(nèi)容中,視圖ViewModel的類定義如下所示。
namespace WHC.SugarProject.WpfUI.ViewModels; /// <summary> /// 簡單的視圖模型定義類 /// </summary> public partial class DashboardViewModel : ObservableObject { /// <summary> /// MVVM模式的可觀測屬性 /// </summary> [ObservableProperty] private int _counter = 0; /// <summary> /// 供視圖界面調(diào)用的Command定義 /// </summary> [RelayCommand] private void OnCounterIncrement() { Counter++; } }
通過這個屬性和命令的聲明處理,我們就可以在View視圖中進(jìn)行調(diào)用處理了,我們可以看到視圖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了。
可以看到屬性名自動變?yōu)榇髮?,Public訪問權(quán)限的,而命令則是我們定義的函數(shù)中后綴增加Command。
?
2、WPF的界面控件包
WPF本身提供了很多原生的控件,也非常強(qiáng)大,可塑性也很好,我們可以通過定義它的樣式繼承,以及一些模板化的處理,可以實現(xiàn)非常豐富、美觀的界面處理效果。另外WPF應(yīng)用本身我們系統(tǒng)基于一個比較好的界面布局來設(shè)置應(yīng)用,因此在綜合了解一些WPF的應(yīng)用開發(fā)包和開源基礎(chǔ)框架后,對界面控件部分,采用了HandyControl的控件,而界面布局則參考lepoco/wpfui 的項目進(jìn)行改進(jìn)。
HandyControl的控件 的
官方地址:https://github.com/HandyOrg/HandyControl??
中文文檔地址:https://handyorg.github.io/handycontrol/
它的界面組件提供很好的樣式定制,而且是基于原生WPF的進(jìn)行擴(kuò)展標(biāo)注即可。
?而lepoco/wpfui 的項目
GitHub地址:https://github.com/lepoco/wpfui
文檔地址:https://wpfui.lepo.co/documentation/
它的演示界面效果如下所示。
相對而言,lepoco/wpfui 的項目最為突出的是它的框架部分,雖然也提供了一些UI控件的封裝,不過樣式都比較普通,而HandyControl的控件則顯得更加美觀一些,因此我綜合兩個項目的優(yōu)點,把它整合一起,結(jié)合MVVM的開發(fā)模式,實現(xiàn)基于SqlSugar框架的WPF應(yīng)用端的開發(fā)。
SqlSugar的開發(fā)框架中WPF應(yīng)用端的登錄界面效果如下。
SqlSugar的開發(fā)框架中WPF應(yīng)用端的字典管理界面效果如下。
批量添加字典項目的界面
?新建、編輯字典項目的界面
?SqlSugar的開發(fā)框架中WPF應(yīng)用端的系統(tǒng)參數(shù)管理界面效果如下。
?
以上是實現(xiàn)的一些功能模塊的界面,具體的功能開發(fā)介紹,后續(xù)繼續(xù)分享介紹。
SqlSugar開發(fā)框架介紹:https://www.iqidi.com/Framework/sugarIndex.htm?
系列文章:
《基于SqlSugar的開發(fā)框架的循序漸進(jìn)介紹(1)--框架基礎(chǔ)類的設(shè)計和使用》
《基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(2)-- 基于中間表的查詢處理》
《基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(3)-- 實現(xiàn)代碼生成工具Database2Sharp的整合開發(fā)》
《基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(4)-- 在數(shù)據(jù)訪問基類中對GUID主鍵進(jìn)行自動賦值處理?》
《基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(5)-- 在服務(wù)層使用接口注入方式實現(xiàn)IOC控制反轉(zhuǎn)》
《基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(6)-- 在基類接口中注入用戶身份信息接口?》
《基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(7)-- 在文件上傳模塊中采用選項模式【Options】處理常規(guī)上傳和FTP文件上傳》
?《基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(8)-- 在基類函數(shù)封裝實現(xiàn)用戶操作日志記錄》
《基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(9)-- 結(jié)合Winform控件實現(xiàn)字段的權(quán)限控制》
《基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(10)-- 利用axios組件的封裝,實現(xiàn)對后端API數(shù)據(jù)的訪問和基類的統(tǒng)一封裝處理》
《基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(11)-- 使用TypeScript和Vue3的Setup語法糖編寫頁面和組件的總結(jié)》
《基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(12)-- 拆分頁面模塊內(nèi)容為組件,實現(xiàn)分而治之的處理》
《基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(13)-- 基于ElementPlus的上傳組件進(jìn)行封裝,便于項目使用》
《基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(14)-- 基于Vue3+TypeScript的全局對象的注入和使用》
?《基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(15)-- 整合代碼生成工具進(jìn)行前端界面的生成》
《基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(16)-- 工作流模塊的功能介紹》
《基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(17)-- 基于CSRedis實現(xiàn)緩存的處理》
?《基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(18)-- 基于代碼生成工具Database2Sharp,快速生成Vue3+TypeScript的前端界面和Winform端界面》
《基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(19)-- 基于UniApp+Vue的移動前端的功能介紹》
《基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(20)-- 在基于UniApp+Vue的移動端實現(xiàn)多條件查詢的處理》
《基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(21)-- 在工作流列表頁面中增加一些轉(zhuǎn)義信息的輸出,在后端進(jìn)行內(nèi)容轉(zhuǎn)換》
?《基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(22)-- Vue3+TypeScript的前端工作流模塊中實現(xiàn)統(tǒng)一的表單編輯和表單詳情查看處理?》
《基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(23)-- Winform端管理系統(tǒng)中平滑增加對Web API對接的需求》
《基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(24)-- 使用Serialize.Linq對Lambda表達(dá)式進(jìn)行序列化和反序列化?》
?《基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(25)-- 基于SignalR實現(xiàn)多端的消息通訊》
《基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(26)-- 實現(xiàn)本地上傳、FTP上傳、阿里云OSS上傳三者合一處理》
《基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(27)-- 基于MongoDB的數(shù)據(jù)庫操作整合》
《基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(28)-- 快速構(gòu)建系統(tǒng)參數(shù)管理界面》
《基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(29)-- 快速構(gòu)建系統(tǒng)參數(shù)管理界面-Vue3+ElementPlus》
《基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(30)-- 整合客戶關(guān)系管理系統(tǒng)模塊功能》
《基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(31)-- 在查詢接口中實現(xiàn)多表聯(lián)合和單表對象的統(tǒng)一處理?》
《利用代碼生成工具快速生成基于SqlSugar框架的Winform界面項目》文章來源:http://www.zghlxwxcb.cn/news/detail-700291.html
《循序漸進(jìn)介紹基于CommunityToolkit.Mvvm 和HandyControl的WPF應(yīng)用端開發(fā)(1)?》文章來源地址http://www.zghlxwxcb.cn/news/detail-700291.html
到了這里,關(guān)于循序漸進(jìn)介紹基于CommunityToolkit.Mvvm 和HandyControl的WPF應(yīng)用端開發(fā)(1)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!