- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
WPF是微软的.net平台中的一个桌面客户端应用程序框架,经常用于企业开发windows桌面客户端,广泛应用于中小企业快速开发一款工具,本人也是比较喜欢利用WPF开发一些小工具.
1.虎牙直播客户端 2.西门子医疗上位机 其中西门子医疗的上位机程序称得上使用WPF技术的极其优秀的项目。(:德国人写代码真的很严格工整。 当然西门子的.net还是基于framework,模块之间通信用的WCF,依赖注入使用的spring.net我在的时候好像准备改成Autofac了。扯远了~ 。
伴随着.net5这个半成品出世,.net framework和core正式合并到一起,在core中也是支持创建WPF模板代码的,那么我们如何在新的平台下优雅的使用WPF开发一个小工具呢?
老的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; }
}
}
当然该包还带了同进程下模块发布订阅的实现。本身的事件也支持绑定异步方法.
常用的依赖注入组件有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>();
如何按照上面做的我们在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 。
最后此篇关于.netcore/5/6/7中WPF如何优雅的开始开发的文章就讲到这里了,如果你想了解更多关于.netcore/5/6/7中WPF如何优雅的开始开发的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
在一个新的 ASP.NET Core RC2 类库中,我有以下 project.json 文件,我试图在其中遵循 How to trim your package dependencies 上的文档.
我在本地提要上将 nuget 包从 2.2.x 更新到 3.1.0。 然后,在构建机器上尝试构建项目,但是: Project.csproj(0,0): Error NU1102: Unable to
快递100的物流信息查询接口,官方提供了一些demo;还好官方提供的代码是.netcore版本写的,不过写的有点low;根据官方提供的代码,我按照.netcore 的风格重构了代码;核心代码如下:
1、docker介绍 docker是用go语言编写基于linux操作系统的一些特性开发的,其提供了操作系统级别的抽象,是一种容器管理技术,它隔离了应用程序对基础架构(操作系统等)的依赖。相较于虚
demo运行在windows的docker中,系统是win10,所以需要先下载docker for windows,安装完毕后系统会重启,然后桌面上可以找到docker for windows的快捷
NetCore WebSocket 即时通讯示例,供大家参考,具体内容如下 1.新建Netcore Web项目 2.创建简易通讯协议 ?
需求场景: 我需要部署的项目是在Windows上开发的,目标框架为.net core 6.0 因此我们需要先在kylin上部署项目运行所需要的环境。 借助百
我正在 .NET Core 中重写一个调用外部 Web 服务的控制台应用程序。 我目前收到以下错误: One or more errors occurred. (The HTTP request is
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 6 年前。 Improve th
我有一组库,我想将其从 PCL 转移到 netcore。通过此举,我想简化 DI 系统并更新一些内部工作方式。 我想添加的其中一件事是内部对象的配置,就像在 Asp.Net Core 中一样(即 se
注:本文隶属于《理解ASP.NET Core》系列文章,请查看置顶博客或 点击此处查看全文目录 概述 在微服务化的架构设计中,网关扮演着重要的看门人角色,它所提供的功能之一
对于有多个应用系统的企业来说,每一个应用系统都有自己的用户体系,这就造成用户在切换不同应用系统时,就要多次输入账号密码,导致体验非常不好,也造成使用上非常不便。 针对这个问题,我们就可以采用单
就像 Web Api 接口可以对入参进行验证,避免用户传入非法的或者不符合我们预期的参数一样,选项也可以对配置源的内容进行验证,避免配置中的值与选项类中的属性不对应或者不满足预期,毕竟大部分配置
.NET Core 选项系统的主要实现在 Microsoft.Extensions.Options 和 Microsoft.Extensions.Options.ConfigurationExten
漏洞说明: 跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击
分布式缓存是由多个应用服务器共享的缓存,通常作为访问它的应用服务器的外部服务进行维护。 分布式缓存可以提高 ASP.NET Core 应用的性能和可伸缩性,尤其是当应用由云服务或服务器场托管时。
一个应用要运行起来,往往需要读取很多的预设好的配置信息,根据约定好的信息或方式执行一定的行为。 配置的本质就是软件运行的参数,在一个软件实现中需要的参数非常多,如果我们以 Hard Code(
2. 配置添加 配置系统可以读取到配置文件中的信息,那必然有某个地方可以将配置文件添加到配置系统中。之前的文章中讲到 ASP.NET Core 入口文件中,builder(WebApplica
3. 配置提供程序 上面提到,通过 IConfigurationBuilder 的实现类对象,我们可以自由地往配置系统中添加不同的配置提供程序,从而获取不同来源的配置信息。.NET Core
4. 自定义配置提供程序 在 .NET Core 配置系统中封装一个配置提供程序关键在于提供相应的 IconfigurationSource 实现和 IConfigurationProvide
我是一名优秀的程序员,十分优秀!