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如何优雅的开始开发的更多相关文章

  1. 【广州.NET社区推荐】【译】Visual Studio 2019 中 WPF & UWP 的 XAML 开发工具新特性

    原文 | Dmitry 翻译 | 郑子铭 自Visual Studio 2019推出以来,我们为使用WPF或UWP桌面应用程序的XAML开发人员发布了许多新功能.在本周的 Visual Studio ...

  2. 【译】Visual Studio 2019 中 WPF & UWP 的 XAML 开发工具新特性

    原文 | Dmitry 翻译 | 郑子铭 自Visual Studio 2019推出以来,我们为使用WPF或UWP桌面应用程序的XAML开发人员发布了许多新功能.在本周的 Visual Studio ...

  3. 使用.NET Core在RESTful API中进行路由操作

    介绍 当列出REST API的最佳实践时,Routing(路由)总是使它位于堆栈的顶部.今天,在这篇文章中,我们将使用特定于.NET Core的REST(web)API来处理路由概念. 对于新手API ...

  4. 在ASP.NET Core的startup类中如何使用MemoryCache

    问: 下面的代码,在ASP.NET Core的startup类中创建了一个MemoryCache并且存储了三个键值“entryA”,“entryB”,“entryC”,之后想在Controller中再 ...

  5. 在.net core不同的版本中 webabi引用的包不同

    core2.0中: 为了要使用MVC Controller 要安装 Microsoft.AspNetCore.Mvc.Core包 Core2.1中:Microsoft.AspNetCore.App

  6. ASP.NET Core 3.0 WebApi中使用Swagger生成API文档简介

    参考地址,官网:https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/getting-started-with-swashbuckle?view ...

  7. 从ASP.Net Core Web Api模板中移除MVC Razor依赖项

    前言 :本篇文章,我将会介绍如何在不包括MVC / Razor功能和包的情况下,添加最少的依赖项到ASP.NET Core Web API项目中. 一.MVC   VS WebApi (1)在ASP. ...

  8. java中的反射机制在Android开发中的用处

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反 ...

  9. Cocos开发中Visual Studio下libcurl库开发环境设置

    我们介绍一下win32中Visual Studio下libcurl库开发环境设置.Cocos2d-x引擎其实已经带有为Win32下访问libcurl库,Cocos2d-x 3.x中libcurl库文件 ...

  10. 【转】Eclipse中设置ButterKnife进行注解式开发步骤 -- 不错

    原文网址:http://www.bubuko.com/infodetail-974262.html 最近在进行Android注解式开发的学习,正在尝试用ButterKnife.ButterKnife的 ...

随机推荐

  1. shell脚本自动化部署Zabbix4.2(修改脚本替换版本)

    #!/bin/bash # 检查操作系统版本,该脚本只能运行在 Centos 7.x 系统上 cat /etc/redhat-release |grep -i centos |grep '7.[[:d ...

  2. 关于kibana启动时有几个warning警告信息的解决办法

    启动kibana时会有几个warning信息,具体如下: 针对xpack这几个相关的,在kibana.yml文件中新增如下三个配置即可: # 注意:参数值至少32位,否则启动会报错提示 xpack.e ...

  3. docker 生成mysql镜像启动时自动执行sql

    文章转载自:https://www.jianshu.com/p/12fc253fa37d 在docker 创建 mysql 容器时,往往需要在创建容器的过程中创建database 实例,代码如下: # ...

  4. centos7使用yum方式安装redis6

    yum -y install epel-release wget make gcc-c++ cd /opt wget https://download.redis.io/releases/redis- ...

  5. 【JAVA】普通IO数据拷贝次数的问题探讨

    最近看到网上有些文章在讨论JAVA中普通文件IO读/写的时候经过了几次数据拷贝,如果从系统调用开始分析,以读取文件为例,数据的读取过程如下(以缓存I/O为例): 应用程序调用read函数发起系统调用, ...

  6. C# 使用原生 System.IO.Compression 实现 zip 的压缩与解压

    zip 是一个非常常见的压缩包格式,本文主要用于说明如何使用代码 文件或文件夹压缩为 zip压缩包及其解压操作, 我们采用的是 微软官方的实现,所以也不需要安装第三方的组件包. 使用的时候记得 usi ...

  7. 适合生产制造企业用的ERP系统有哪些?

    什么叫适合?匹配很重要!同是生产制造企业,规模不同.行业不同.发展阶段不同.生产模式不同.管理理念不同,适用的ERP自然也不同.不同规模的企业选用不同的系统,如过你是大型企业,业务管理都比较标准规范, ...

  8. 市面上erp软件那么多,为什么很多卖家选择定制erp?

    为什么选择定制ERP?适合自己的才是最好的啊!就连头部ERP企业提供给用户的ERP系统,应该也没有不进行个性化定制的吧,匹配很重要!规模不同.行业不同.发展阶段不同.生产模式不同.管理理念不同,适用的 ...

  9. P8548 小挖的买花 方法记录

    原题链接 小挖的买花 题目背景 小挖喜欢买花,但是 ta 太懒了!所以这个任务全权交给了你. 题目描述 花店里只有 \(n\) 株花,每一株花都有三个属性:价格 \(cost_i\).美丽度 \(be ...

  10. MYSQL创建分区时候报错

    第一种:ERROR 1064 (42000): Partitioning can not be used stand-alone in query near  不能单独创建分区.创建分区时要创建分区表 ...