写点什么

.NET 5 重大变更之 WPF 和 Windows Forms

2021 年 1 月 21 日

.NET 5重大变更之WPF和Windows Forms

.NET 5 重大变更系列的最后一个主题是 WPF 和 Windows Forms。这些桌面技术在.NET Core 3.0 之前是不可用的,因为.NET Core 的早期版本主要专注于基于 Web 的应用程序(ASP.NET Core)。


2002 年.NET 首次发布时,Windows Forms(非正式地被称为 WinForms)是最早的应用程序框架之一。(其他框架包括 WebForms、Console 和 Windows Services。)WinForms 深受 Visual Basic 的影响,和 VB 一样,它对原生 Windows 控件进行了一层薄薄的包装。默认情况下,这提供了非常好的性能,但定制能力相当有限。一般来说,开发人员应该允许操作系统处理样式等方面的东西。


WinForms 的第一个主要变化是在 2005 年发布的.NET 2.0 中出现的,引入了微软认为低效的各种用户控件的替代品,包括基本的数据网格。从那时起,这项技术就被认为是“完整的”,唯一的变化是偶尔更新一下,以便支持更高的 DPI。即使是长期存在的 bug 通常也会被忽略,这让使用 WinForms 进行新项目开发的开发人员感到非常恼火。


Windows Presentation Foundation (WPF)是微软首次尝试创建的一个完全可定制的 GUI 框架。虽然只比 WinForms 晚发布了四年,但它还是花了很长一段时间才被普遍接受,因为它的设计模式和概念更为复杂,性能也可能是一个问题。虽然有些技术(如虚拟化)可以使 WPF 在大型数据集上比 WinForms 快得多,但需要更深入的知识才能正确使用它们。此外,很多开发人员认为定制样式是必需的,因为默认样式很“丑”。


WPF 有两个影响深远的关键“特性”,一个是使用 XAML 进行 UI 布局,另一个是使用 MVVM 模式进行数据绑定。这些也被引入到其他项目中,比如 Silverlight 和 Universal Windows Platform。


像 WinForms 一样,WPF 多年来也一直被认为是“完整的”。它甚至不支持XAML-2009,即使是在 2012 年XAML规范发布之后。作为回应,Avalonia等项目试图改进 WPF 的缺陷,比如允许将事件直接绑定到模型或视图模型。

新的 SDK


在.NET Core 3.x 中,WPF 和 WinForms 需要一个叫作 Microsoft.NET.Sdk.WindowsDesktop 的自定义 SDK。在.NET 5 中,使用的是 Microsoft.NET.Sdk,就像其他.NET 5 项目一样。但现在的目标框架是 net5.0-windows,而不是 net5.0。

隐藏控制台输出


绝大多数 WPF 和 WinForms 应用程序不显示控制台窗口,这是默认的选项。如果你需要一个地方来显示额外的诊断信息,可以将 OutputType 设置为 Exe 而不是 WinExe。


在.NET 5 中,除非你将 DisableWinExeOutputInference 设置为 true,否则 OutputType 设置将被忽略。

错误处理的改进


错误处理的改进也可能是个重大变更。在.NET Core 3 的 Windows Forms 中,很多验证代码根本不存在。这意味着如果你传入一个无效的参数,它可能会抛出一个 NullReferenceException 或者表现出一种不确定的行为。


在.NET 5 中,它会抛出相应的 ArgumentException、ArgumentNullException 或 ArgumentOutOfRangeException。如果是属性为空,而不是参数为空,那么将抛出 InvalidOperationException。


有关如何正确使用异常,请参见.NET中的异常设计

移除状态栏控件


我们在上面讨论 WinForms 的历史,是为了解释状态栏控件都发生了什么。在.NET Framework 2 中被替换的一个控件是不起眼的StatusBar。在.NET 2 中是StatusStrip,它们的作用是一样的。


微软没有解释为什么要移除它,所以对于一个大多数人都不知道的控制,其维护成本太高了。StatusBar 在设计器工具箱中已经很久不可见了,在.NET 5 中已经被移除了。


本系列其他文章



原文链接


.NET 5 Breaking Changes for WPF/Windows Forms

2021 年 1 月 21 日 19:562054

评论

发布
暂无评论
发现更多内容

公安情报研判管控分析平台建设解决方案

t13823115967

智慧公安情报研判系统开发 智慧公安 情报研判管控分析平台

《写给大忙人看的JAVA核心技术》.pdf

田维常

电子书

话题讨论 |程序员35岁被裁,是真的吗?你离35岁还有几年?

Java_若依框架教程

话题讨论

智慧公安情报指挥合成作战管控平台开发

t13823115967

智慧公安情报研判系统开发 智慧公安 合成作战管控平台

第十一周 安全稳定总结

钟杰

极客大学架构师训练营

阿里 双11 同款流控降级组件 Sentinel Go 正式 GA,助力云原生服务稳稳稳

阿里巴巴云原生

开发者 云原生 中间件 开源项目 双十一

一不小心,就入选Gartner魔力象限了

数据君

数据库

架构师训练营第 1 期 -week12

习习

第七周总结

小兵

年薪百万offer从何入手?这份“通关面试手册”带你轻松碾压字节面试官

比伯

Java 编程 架构 面试 计算机

警务信息综合应用平台建设,可视化研判系统开发

WX13823153201

警务信息综合应用平台建设

架構師訓練營第 1 期 - 第 11 周總結

Panda

架構師訓練營第 1 期

量化交易系统APP软件开发(现成)

开發I852946OIIO

系统开发

大企软件系统问题多?归乡名企工程师:解决很简单,分分钟做个新系统

Philips

敏捷开发

第十一周 安全稳定作业

钟杰

极客大学架构师训练营

阿里云Lindorm与Intel、OSIsoft共建IT & OT超融合工业数据云

许力

数据库 大数据 IoT 工业互联网 工业物联网

Meet new Sentinel Go committers!

阿里巴巴云原生

开源 开发者 云原生 sentinel 中间件

今天,我们和人民大学一起干了件大事!

数据君

数据库

程序员的真实故事

Learun

敏捷开发

阿里巴巴内部秘密培养的“Java架构师养成计划”图谱曝光,全是干货!

Java架构追梦

Java 学习 架构 面试 阿里巴巴人才培养计划

教你用Python自制拼图小游戏,轻松搞定熊孩子

华为云开发者社区

Python 游戏 拼图

每周学点 TARS——服务鉴权功能

TARS基金会

DevOps 后端 鉴权 TARS

线程上下文切换,这些是你需要掌握的

田维常

系统上下文

云计算领域-杨明越加入InfoQ协作平台

杨明越

数据资产管理平台规划概要

马踏飞机747

数据治理 数据资产 大数据架构

基于区块链技术落地应用开发-食品溯源

13828808769

Linux中父进程为何要苦苦地知道子进程的死亡原因?

linux大本营

c++ Linux 后台开发 进程

人工智能应用实操:手把手教你用Python控制IoT智能硬件

智能物联实验室

物联网 IoT

云图说|AI开发难!难!难!端云协同多模态AI开发套件你需要了解一下

华为云开发者社区

AI 分布式协同 开发

突破容量极限:TiDB 的海量数据“无感扩容”秘籍

京东科技开发者

分布式数据库 #TiDB

CloudIDE插件在手,按时下班不愁

华为云开发者社区

ide Cloud CloudIDE

Leader修炼指“北”:管理路上的大小Boss

Leader修炼指“北”:管理路上的大小Boss

.NET 5重大变更之WPF和Windows Forms-InfoQ