【译】.NET 5. 0 中 Windows Form 的新特性
自从 Windows Form 在 2018 年底开源并移植到 .NET Core 以来,团队和我们的外部贡献者都在忙于修复旧的漏洞和添加新功能。在这篇文章中,我们将讨论 .NET 5.0 中 Windows Form 的新特性。
Windows控件的增加与增强
也许今天关于 Windows Form 最令人兴奋的事情是我们在 GitHub 上的充满活力和参与度的社区。许多新特性和增强是我们的社区成员建议的,甚至是完全实现的。在 .NET 5.0 的时间表内,我们已经接受并合并了 900 多个 pull-request,其中 70% 以上的 PRs 来自我们的社区。我们非常感谢 @hughbe, @gpetrou, @weltkante, @kpreisser 和许许多多帮助我们改进的开发者们。
以下是我们从社区收到的一些贡献的例子。
新TaskDialog控件
@kpreisser贡献

task dialog 是一种对话框,可用于显示信息和接收用户的简单输入,但具有比 message box 更多的功能。与 message box 类似,操作系统根据您设置的参数对其进行格式化。
改进ListView
@hughbe 和 @lonitra 贡献
ListView 控件对于 Windows 窗体开发人员来说是非常熟悉的,但是它缺少 API 来方便地访问 Windows Vista 中添加的一些特性,比如可折叠组、组任务、副标题和页脚。
在 .NET 5.0 中,我们弥补了 API 的差距,现在 Windows Form 的 ListView 更接近于本地的 Win32 控件。

改进FileDialog
@jnm2 贡献
FileDialog 收到了一个新的 API : FileDialog.ClientGuid。Windows file dialog 允许调用应用程序将 GUID 与对话框的持久化状态关联起来。对话框的状态可以包括诸如最近访问的文件夹、对话框的位置和大小等因素。通常,此状态是基于可执行文件的名称持久化的。通过指定 GUID,应用程序可以为同一应用程序中对话框的不同版本拥有不同的持久化状态(例如,import dialog 和 open dialog)。
性能改进
一直被认为是围绕 Win32 API 集的托管封装。因此,Windows Form 一直严重依赖互操作层来与非托管 Windows 组件通信。在 .NET Core 早期的首要任务就是优化我们的互操作层,使结构具有 blittable(blittable 是:在托管和非托管内存中都有公共的表示形式,而不需要 Interop 封送拆收器的特殊处理...),明确地选择更有效的“W”函数,并在可能的情况下使用“unsafe”代码。所有这些变化都是我们所说的“花生酱变化”,从某种意义上说,每一个变化都很小,很难观察到,但在应用程序的生命周期中,这些变化累积起来会带来实质性的性能提升。
在 .NET 5.0 中,我们提高了门槛,优化了几个绘制路径。历史的 Windows Form 依赖于 GDI+(和一些 GDI)来呈现操作。虽然 GDI+ 比 GDI 更容易使用,因为它通过 Graphics 对象抽象设备上下文(包含特定显示设备信息的结构,如显示器或打印机),但由于额外的开销,它的速度也很慢。在我们处理纯色和笔刷的一些情况下,我们选择使用 GDI。
我们还扩展了一些渲染相关 IDeviceContext 接口的 API,例如 PaintEventArgs,它可能不能直接提供给 Windows Form 开发者,允许我们绕过 GDI+ 图形对象,从而减少分配和获得速度。这些优化显示了重绘路径中内存消耗的显著减少,在某些情况下节省了 10 倍内存分配。

如果你想了解更多的技术细节,你可以观看 API 评论,或者观看。.NET Community Standup,Jeremy Kuhne在其中谈论了这些优化。
你可以在这里获取测试项目:https://github.com/JeremyKuhne/RedrawPerformance,并自己验证结果,就像我们的用户之一——Jeremy Sinclair:

最后重要一点,我们已经扩展了 TextRenderer API 来接受 ReadOnlySpan<char>重载,因为绘制和测量文本是一个非常常见的活动。当可以避免新的字符串分配时(分割其他输入,构建基于堆栈的字符数组,等等),这将允许显著更有效的文本渲染。
可访问性改进和修复
在过去的几年中,团队一直在更新已经有20多年的 Windows Forms SDK,以满足今天的可访问性需求和适用性。
在 .NET 5.0 中,我们做了很多改进,包括但不限于以下内容:
UI 自动化支持的许多控件,包括:
Button
ListView
CheckBox
RadioButton, 等
LegacyIAccessible Control Pattern 支持使客户端能够更好地与UI控件交互,并允许开发人员为其控件设置自定义 AccessibleRole 属性。
Test 和 TextRange 控件模式支持客户端从基于文本的控件检索文本内容、文本属性和嵌入的对象。

我们还修复了一些在某些辅助工具下影响用户体验的问题。例如,我们重写了可访问性实现,以访问 AccessibleObject 不再导致过早创建控件句柄的方式,这反过来确保了更多可预测的控制行为,并避免了 UI 中的意外情况。
我们还改进和纠正了一些控件(如 PropertyGrid 和 MonthCalendar)中的行为,这些控件可能会阻止易用性工具正确导航 UI,或者在严重的情况下,导致应用程序崩溃。
VB支持
Visual Basic 及其应用程序框架在 .NET 5 和 Visual Studio 16.8 中得到了支持!Visual Studio 16.8 包含 Windows Form 设计器,因此 Visual Basic已经为迁移现有应用程序或创建新应用程序做好了准备。
更多信息参考《Visual Basic WinForms Apps in .NET 5 and Visual Studio 16.8 post.》
向@paul1956致敬,感谢他帮助我们解决Visual Basic相关问题。
破坏性变化
虽然我们打算尽可能地保持与 .NET Framework 和 .NET Core 的向后兼容性,但这并不总是谨慎的。你可以在这里找到破坏性变化的列表:
.NET Framework to .NET Core 3.1
.NET Core 3.1 to .NET 5.0
已知问题列表请参考《.NET 5.0 Known Issues document》。
展望未来
我们意识到目前的高 DPI 支持还远远不够完美,这是我们计划在 .NET 6.0 时间框架内改进的地方。“高DPI支持”的含义有很多方面,所以我们很乐意了解更多它对你的意义。如果你有特别的问题想让我们解决,请在下面留下评论或直接在 dotnet/winforms 中提交问题。
我们计划继续进行“花生酱优化”、可访问性改进、可空引用类型注释和一般代码改进。
报告bug并提出建议
如果您有任何意见、建议或面临的问题,请让我们知道!通过 Visual Studio Feedback 提交 Visual Studio 和 Designer 相关的问题(在 Visual Studio 的右上角寻找一个按钮),以及在我们的 GitHub 仓库中提交 Windows 窗体运行时相关的问题。
我们还考虑 API 建议,进一步丰富 Windows 窗体 SDK,使构建 Windows 应用程序更容易(如任务对话框)。如果你拥护一个提案——你很有可能会在 Windows Forms SDK 中看到它。
你也可以成为 Windows 窗体代码库的贡献者!我们的存储库中有标记为“up for grabs”的项目,并批准了准备开发的 API,我们将非常感谢您帮助实现它们!
编码快乐!
原文链接
https://devblogs.microsoft.com/dotnet/whats-new-in-windows-forms-runtime-in-net-5-0/

【译】.NET 5. 0 中 Windows Form 的新特性的更多相关文章
- Android5.0中Material Design的新特性
最近项目中需要用到Material Design,整理了下面几个常用的控件,以便记忆. 一.Snackbar 1.作用:与Toast类似,但是可以点击监听: 2.使用: (1)Snackbar调用静态 ...
- [译]C#8.0中一个使接口更加灵活的新特性-默认接口实现
9月份的时候,微软宣布正式发布C#8.0,作为.NET Core 3.0发行版的一部分.C#8.0的新特性之一就是默认接口实现.在本文中,我们将一起来聊聊默认接口实现. 众所周知,对现有应用程序的接口 ...
- Atitit opencv3.0 3.1 3.2 新特性attilax总结
Atitit opencv3.0 3.1 3.2 新特性attilax总结 1. 3.0OpenCV 3 的改动在哪?1 1.1. 模块构成该看哪些模块?2 2. 3.1新特性 2015-12-21 ...
- ArcGIS API for JavaScript 4.2学习笔记[0] AJS4.2概述、新特性、未来产品线计划与AJS笔记目录
放着好好的成熟的AJS 3.19不学,为什么要去碰乳臭未干的AJS 4.2? 4.2全线基础学习请点击[直达] 4.3及更高版本的补充学习请关注我的博客. ArcGIS API for JavaScr ...
- Python 3.8.0 正式版发布,新特性初体验 全面介绍
Python 3.8.0 正式版发布,新特性初体验 北京时间 10 月 15 日,Python 官方发布了 3.8.0 正式版,该版本较 3.7 版本再次带来了多个非常实用的新特性. 赋值表达式 PE ...
- atitit.Servlet2.5 Servlet 3.0 新特性 jsp2.0 jsp2.1 jsp2.2新特性
atitit.Servlet2.5 Servlet 3.0 新特性 jsp2.0 jsp2.1 jsp2.2新特性 1.1. Servlet和JSP规范版本对应关系:1 1.2. Servlet2 ...
- 简单理解ECMAScript2015中的箭头函数新特性
箭头函数(Arrow functions),是ECMAScript2015中新加的特性,它的产生,主要有以下两个原因:一是使得函数表达式(匿名函数)有更简洁的语法,二是它拥有词法作用域的this值,也 ...
- ABAP 7.52 中的Open SQL新特性
S/4 HANA 1709 已经在几个月前发布,随之而来的是ABAP 7.52. 本文翻译了更新文档中有关Open SQL的部分 本文链接:http://www.cnblogs.com/hhelibe ...
- ABAP 7.40, SP08 中的 Open SQL 新特性
1,使用 data_source~*指定列 在7.40, SP08中,可以在SELECT语句中使用data_source~*来指定选取不同的数据库表.视图的全部列来作为结果集.它也可以和单独指定的列c ...
随机推荐
- [leetcode]Next Greater Element
第一题:寻找子集合中每个元素在原集合中右边第一个比它大的数. 想到了用哈希表存这个数的位置,但是没有想到可以直接用哈希表存next great,用栈存还没找到的数,没遍历一个数就考察栈中的元素小,小的 ...
- JavaDailyReports10_11
********************************** 验证码 AWT Swing 1 package nanshen; 2 3 import java.awt.Container; 4 ...
- tail常用命令总结
tail命令作用: tail命令用途是依照要求将指定的文件的最后部分输出到标准设备,通常是终端,通俗讲来,就是把某个档案文件的最后几行显示到终端上,假设该档案有更新,tail会自己主动刷新,确保你看到 ...
- sql操作数据库(1)-->DDL、DML、DQL
SQL 操作数据库 概念:结构化查询语言 Structured Quary Language 作用: 1.是一种数据库的查询的标准,对所有的数据库都支持 2.不同的数据库SQL语句可能有点不同 ( ...
- 不想加班开发管理后台了,试试这个 Java 开源项目吧!
本文适合有 Java 基础并了解 SpringBoot 框架的同学 本文作者:HelloGitHub-嘉文 这里是 HelloGitHub 推出的<讲解开源项目>系列,今天给大家带来一款开 ...
- kafka容器报内存不足异常(failed; error='Cannot allocate memory' (errno=12))
一.启动kafka broker时异常 nohup /mnt/sata1/kafka_2.11-0.10.0.1/bin/kafka-server-start.sh /mnt/sata1/kafka_ ...
- 2020再见&新的计划(建立Android体系架构)
2020,再见 关于2020,我心中有四个关键词: 疫情 年初突如其来的疫情,打破了原本生活的节奏,也没想到会笼罩全世界整整一年,希望这个世界早点好起来吧. 科比 初三的早晨,噩耗传来,我一度不敢相信 ...
- 浅谈 Checkbox Group 的双向数据绑定
前言 不曾想在忙碌的工作面前,写一篇技术博客也成了奢求. Checkbox 作为表单中最常见的一类元素,使用方式分为单值和多值,其中单值的绑定很简单,就是 true 和 false,但是多值(Chec ...
- LeetCode105 从前序和中序序列构造二叉树
题目描述: 根据一棵树的前序遍历与中序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9 ...
- Java并发包源码学习系列:ReentrantReadWriteLock读写锁解析
目录 ReadWriteLock读写锁概述 读写锁案例 ReentrantReadWriteLock架构总览 Sync重要字段及内部类表示 写锁的获取 void lock() boolean writ ...