.net core/5/6/7中WPF如何优雅的开始开发
WPF是微软的.net平台中的一个桌面客户端应用程序框架,经常用于企业开发windows桌面客户端,广泛应用于中小企业快速开发一款工具,本人也是比较喜欢利用WPF开发一些小工具。
知名案例
1.虎牙直播客户端
2.西门子医疗上位机
其中西门子医疗的上位机程序称得上使用WPF技术的极其优秀的项目。(:德国人写代码真的很严格工整。
当然西门子的.net还是基于framework
,模块之间通信用的WCF,依赖注入使用的spring.net
我在的时候好像准备改成Autofac
了。扯远了~
.net core/5/6/7中开发WPF
伴随着.net5这个半成品出世,.net framework和core正式合并到一起,在core中也是支持创建WPF模板代码的,那么我们如何在新的平台下优雅的使用WPF开发一个小工具呢?
MVVM
老的framework我喜欢使用MvvmLightLibs
,但是目前用过的都知道该包已经被标记为弃用了,推荐使用微软的CommunityToolkit.Mvvm
,我们可以在项目文件中添加该包的引用
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.0.0" />
添加好了之后我们将我们的viewmodel
继承ObservableObject
具体使用可以看园子里的一篇文章https://www.cnblogs.com/dino623/p/building_MVVM_programs_using_MVVM_Toolkit.html
示例代码:
public class MainWindowViewModel : ObservableObject{/// <summary>/// 属性变更通知/// </summary>private Page _currentPage;public Page CurrentPage{get => _currentPage;set => SetProperty(ref _currentPage, value);}//命令绑定public RelayCommand ShiftWorkPageCommand { get; set; }public RelayCommand OpenWorkSpaceCommand { get; set; }}}
当然该包还带了同进程下模块发布订阅的实现。本身的事件也支持绑定异步方法。
DI
常用的依赖注入组件有spring.net,autofac
,当然autofac
在现在看来也是非常流行强大的。.net一直有一个自带的依赖注入容器,功能没有autofac强大,但是一般也够用。我们需要在项目文件中导入微软提供的相关的包。
<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1" />
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="6.0.0" />
我们会在程序启动的时候创建一个默认的Host
宿主对象,WPF的起始类就是app.cs
里,我们可以覆写OnStartup
方法,在其中启动一个Host
,并且将一些服务注册进来。如日志,配置文件,数据库配置等。
public partial class App : Application{public static IServiceProvider ServiceProvider;protected async override void OnStartup(StartupEventArgs e){base.OnStartup(e);var hostbuilder = CreateHostBuilder(e.Args);var host = await hostbuilder.StartAsync();ServiceProvider = host.Services;host.Services.GetRequiredService<MainWindow>()?.Show();}public static IHostBuilder CreateHostBuilder(string[] args){var hostBuilder = Host.CreateDefaultBuilder(args).UseSerilog((context, logger) =>//注册Serilog{logger.ReadFrom.Configuration(context.Configuration);logger.Enrich.FromLogContext();});hostBuilder.ConfigureServices((ctx, services) =>{services.AddSingleton<MainWindow>();services.AddSingleton<MainWindowViewModel>();});return hostBuilder;}}
tips :记得把App.xaml
中的StartUpUri
删除掉。
上面的代码中,我们就注册了serilog日志,以及一些我们需要注入的对象,我们可以控制他们的生命周期,关于如何使用.net自带的依赖注入以及为什么需要控制反转可以看这篇网址:https://www.cnblogs.com/youring2/p/10926590.html。
那么如何使用呢?
我们可以在需要注入的地方通过构造器注入,比如我们的MainWindowViewModel
是需要绑定到MainWindow
的上下文对象上的,我们可以这样做:
public partial class MainWindow : Window{public MainWindow(MainWindowViewModel viewModel){InitializeComponent();DataContext = viewModel;}}
这样程序在实例化MainWindow
的时候就会从容器中取到MainWindowViewModel
实例放到构造中,不需要我们关心如何去new
这样一个对象。
我们还在App.cs
中放了一个静态的ServiceProvider
存储ServiceProvider
的实例,方便我们全局使用,这是因为有的地方我们不方便构造器的依赖注入,我们就可以利用该对象使用依赖查找的办法获取对象实例:
ServiceProvider.GetRequiredService<MainWindowViewModel>();
Configuration
如何按照上面做的我们在WPF启动的时候注册一个默认的Host
,那么也会将配置模块带入到项目中,我们如何使用配置模块?我们可以在项目根目录下创建一个appsettings.json
文件,并且右键->属性
设置成这样
这样我们就可以使用.net自带的IConfiguration
进行配置文件的读取。这个IConfiguration
也是可以通过构造方法注入的,我们想在程序里或者配置文件里这个节点的配置就可以如下操作:
当然了具体更多操作和用法,包括需要根据不同环境区分加载不同的配置以及不喜欢appsettings.json
这个名字,想用其他名字都是可以配置的。appsettings.json
是他框架默认的配置文件名字,会去找根目录下这个文件,如果你没有配置成其他名字的话。更多配置的操作可以查看该网址:https://www.cnblogs.com/stulzq/p/8570496.html
结尾
目前为止我们只是介绍了几个方面的WPF的在.net core/5/6/7
中的优雅用法。也是一个基础的搭建,当然只有一个良好的基础,一个低耦合,符合规范的基础才能hold住之后写代码天高任鸟飞的愿景哈哈哈哈。
.net core/5/6/7中WPF如何优雅的开始开发相关推荐
- 【译】Visual Studio 2019 中 WPF UWP 的 XAML 开发工具新特性
原文 | Dmitry 翻译 | 郑子铭 自Visual Studio 2019推出以来,我们为使用WPF或UWP桌面应用程序的XAML开发人员发布了许多新功能.在本周的 Visual Studio ...
- VS 2010 Beta2中WPF与Silverlight的关键区别?
WPF支持多种类型的触发器.一个简单的触发器附加到依赖关系属性后,当触发器条件满足的时候便会自动修改样式.除了简单触发器以外,WPF也支持可响应路由事件或使用数据绑定的触发器.Silverlight使 ...
- libcoredb.class.php,ThinkPHP/Lib/Core/Db.class.php中pdo处理逻辑似乎不完善,导致config中pdo配置失效...
在ThinkPHP/Lib/Core/Db.class.php中逻辑判断似乎不完善 源码 // 如果配置为空,读取配置文件设置 if( C('DB_DSN') && 'pdo' != ...
- [第二篇]如何在ASP.Net Core的生产环境中使用OAuth保护swagger ui
在我上篇文章如何在ASP.Net Core的生产环境中保护swagger ui中,我们讨论了如何使用基本身份验证来保护 swagger ui. 使用 OAuth 2.0 和 OpenIdConnect ...
- ASP.NET Core依赖注入容器中的动态服务注册
介绍 在ASP.NET Core中,每当我们将服务作为依赖项注入时,都必须将此服务注册到ASP.NET Core依赖项注入容器.但是,一个接一个地注册服务不仅繁琐且耗时,而且容易出错.因此,在这里,我 ...
- .net 任务调度 mysql_C#/.NET/.NET Core应用程序编程中实现定时任务调度的方法或者组件...
C#/.NET/.NET Core的定时任务调度组件:Timer.FluentScheduler.TaskScheduler.Gofer.NET.Coravel.Quartz.NET.Hangfire ...
- OEA 中 WPF 树型表格整体重构
为什么要重构 上两个月主要做了一件事情,那就是把 OEA 框架中的 TreeGrid 控件,从结构上重新设计,并大量重构现有代码.而花较大精力做这件事的原因,主要是因为: 业务中需要支持一系列新功能: ...
- C#中WPF ListView绑定数据的实例详解
C#中WPF ListView绑定数据的实例详解 发布时间: 2019-03-09 19:29:46 来源: 互联网 作者: 晨曦888 栏目: C#教程 点击: 298 这篇文章主要介绍了C#中WP ...
- Windows平台三大软件开发工具Delphi、WPF .NET Framework和Electron开发对比综述
Embarcadero委托白皮书研究了Delphi,WPF .NET Framework和Electron之间用于构建Windows桌面应用程序的区别.由三个Delphi最有价值专家(MVP)志愿者, ...
最新文章
- 2022-2028年中国智能眼镜行业深度调研及投资前景预测报告
- mysql9索引实战_课程介绍目录索引
- 【Android 应用开发】UI绘制流程 ( 生命周期机制 | 布局加载机制 | UI 绘制流程 | 布局测量 | 布局摆放 | 组件绘制 | 瀑布流布局案例 )
- mysql1756_MySQL Error_code: 1756
- 转载 - 最近对问题
- Problem B: 结构体---职工信息结构体
- jmeter参数值只读取了第一个_基础入门篇Jmeter(五)_函数
- 系统学习NLP(二)--语音合成的计算机处理综述
- vs:严重性代码说明项目文件行错误LNK1168无法打开testes.exe进行写入
- Pandas日期时间格式化
- WebStrom配置好git后文件颜色代表的含义
- 顺势而为,人生会更轻松
- CTF-综合测试(高难度)【超详细】
- Python解释器的选择,初学者必看
- 在MySQL中创建视图的X种方式
- 计算身体质量指数BMI
- Error: EPERM: operation not permitted(权限问题 errro permit)
- 【CAD二次开发】第1.1 AutoCAD .NET API 基础《 了解 AutoCAD 对象层次》
- 分析百度云和360云的区别
- h264源码分析[0]
热门文章
- JAVA中去掉字符串中的空格
- Java Web项目实战案例一
- 用Go语言编程的利与弊
- 将 Flutter 应用程序连接到 BLE 设备并监听数据
- 系统穿越频率用matlab,基于Matlab的自动控制系统设计
- SAS 9.4 的超详细安装过程(保姆级教程)(含安装包+常见问题解决)
- Unix痛恨者手册--巨经典
- 安装windows+linux双系统
- windows 7 系统 使用NVMe固态硬盘----打补丁(安装程序遇到错误0x80240037)
- SSI技术的前端动态实现(AJAX+SSI,适用于任何系统,包括搭载嵌入式RTOS的STM32系列开发板)