.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住之后写代码天高任鸟飞的愿景哈哈哈哈。
我自己做的一个lol插件也是使用WPF做的,目前全网下载量破万,github star 180+,也是基于这些概念开发的,有兴趣的小伙伴可以了解也好,学习也好。
https://github.com/BruceQiu1996/NPhoenix
.net core/5/6/7中WPF如何优雅的开始开发的更多相关文章
- 【广州.NET社区推荐】【译】Visual Studio 2019 中 WPF & UWP 的 XAML 开发工具新特性
原文 | Dmitry 翻译 | 郑子铭 自Visual Studio 2019推出以来,我们为使用WPF或UWP桌面应用程序的XAML开发人员发布了许多新功能.在本周的 Visual Studio ...
- 【译】Visual Studio 2019 中 WPF & UWP 的 XAML 开发工具新特性
原文 | Dmitry 翻译 | 郑子铭 自Visual Studio 2019推出以来,我们为使用WPF或UWP桌面应用程序的XAML开发人员发布了许多新功能.在本周的 Visual Studio ...
- 使用.NET Core在RESTful API中进行路由操作
介绍 当列出REST API的最佳实践时,Routing(路由)总是使它位于堆栈的顶部.今天,在这篇文章中,我们将使用特定于.NET Core的REST(web)API来处理路由概念. 对于新手API ...
- 在ASP.NET Core的startup类中如何使用MemoryCache
问: 下面的代码,在ASP.NET Core的startup类中创建了一个MemoryCache并且存储了三个键值“entryA”,“entryB”,“entryC”,之后想在Controller中再 ...
- 在.net core不同的版本中 webabi引用的包不同
core2.0中: 为了要使用MVC Controller 要安装 Microsoft.AspNetCore.Mvc.Core包 Core2.1中:Microsoft.AspNetCore.App
- ASP.NET Core 3.0 WebApi中使用Swagger生成API文档简介
参考地址,官网:https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/getting-started-with-swashbuckle?view ...
- 从ASP.Net Core Web Api模板中移除MVC Razor依赖项
前言 :本篇文章,我将会介绍如何在不包括MVC / Razor功能和包的情况下,添加最少的依赖项到ASP.NET Core Web API项目中. 一.MVC VS WebApi (1)在ASP. ...
- java中的反射机制在Android开发中的用处
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反 ...
- Cocos开发中Visual Studio下libcurl库开发环境设置
我们介绍一下win32中Visual Studio下libcurl库开发环境设置.Cocos2d-x引擎其实已经带有为Win32下访问libcurl库,Cocos2d-x 3.x中libcurl库文件 ...
- 【转】Eclipse中设置ButterKnife进行注解式开发步骤 -- 不错
原文网址:http://www.bubuko.com/infodetail-974262.html 最近在进行Android注解式开发的学习,正在尝试用ButterKnife.ButterKnife的 ...
随机推荐
- 读完 RocketMQ 源码,我学会了如何优雅的创建线程
RocketMQ 是一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时.高可靠的消息发布与订阅服务. 这篇文章,笔者整理了 RocketMQ 源码中创建线程的几点技巧,希望大家读完之后,能 ...
- ProxySQL 使用情况报错问题汇总及解决办法
1.ProxySQL Error: connection is locked to hostgroup 2 but trying to reach hostgroup 1 解决方案:登上proxysq ...
- 车辆稳定性辅助(VSA)系统
当车辆转弯大于或小于预期时,VSA有助于在转弯时稳定车辆. 同时还有助于在湿滑路面上保持牵引力. VSA 打开和关闭 禁用: 请长按按钮直至听到哔的一声.VSA 关闭指示灯点亮. 恢复: 按下按钮直至 ...
- 使用tomcat部署java的war包操作
修改tomcat配置文件server.xml 修改端口号,别跟其他已经被使用的端口号起冲突 修改项目所在路径 <?xml version="1.0" encoding=&qu ...
- Elastic:使用ElastAlert发送邮件通知
转载自:https://blog.csdn.net/UbuntuTouch/article/details/105473542 文档地址:https://elastalert.readthedocs. ...
- 第五章:Admin管理后台 - 2:自定义Admin actions
通常情况下,admin的工作模式是"选中目标,然后修改目标",但在同时修改大量目标的时候,这种模式就变得重复.繁琐. 为此,admin提供了自定义功能函数actions的手段,可以 ...
- 打造企业自己代码规范IDEA插件(上)
"交流互鉴是文明发展的本质要求.只有同其他文明交流互鉴.取长补短,才能保持旺盛生命活力." 这说的是文明,但映射到计算机技术本身也是相通的,开源代码/项目就是一种很好的技术交流方式 ...
- csv->html
seg1=''' <!DOCTYPE HTML>\n<html>\n<body>\n<meta charset=gb> <h2 align=cen ...
- Css3中自适应布局单位vh、vw
视口单位(Viewport units) 什么是视口? 在桌面端,视口指的是在桌面端,指的是浏览器的可视区域:而在移动端,它涉及3个视口:Layout Viewport(布局视口),Visual Vi ...
- .Net下的分布式唯一ID
分布式唯一ID,顾名思义,是指在全世界任何一台计算机上都不会重复的唯一Id. 在单机/单服务器/单数据库的小型应用中,不需要用到这类东西.但在高并发.海量数据.大型分布式应用中,这类却是构建整个系统的 ...