【译】.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 ...
随机推荐
- HBase内存配置及JVM优化
前言 本文从HBase的内存布局说起,先充分了解HBase的内存区的使用与分配,随后给出了不同业务场景下的读写内存分配规划,并指导如何分析业务的内存使用情况,以及在使用当中写内存Memstore及读内 ...
- Android驱动学习-灯光系统总体框架
Android的app访问硬件的大致流程可以分为一下几个步骤: 我们之前说过Android系统在添加新的硬件的时候需要添加一个接口java文件,通过jni来访问硬件. 这个java是我们自己实现的,我 ...
- docker基础属性简介包含镜像 容器 registry服务等概念及关系
Docker 镜像 我们都知道,操作系统分为内核和用户空间.对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持.而 Docker 镜像(Image),就相当于是一个 r ...
- LinkedList 的 API 与数据结构
LinkedList 是 List 接口和 Deque 接口的双向链表实现,它所有的 API 调用都是基于对双向链表的操作.本文将介绍 LinkedList 的数据结构和分析 API 中的算法. 数据 ...
- Java的nanoTime()方法
java有两个获取和时间相关的秒数方法,一个是广泛使用的 System.currentTimeMillis() 返回的是从一个长整型结果,表示毫秒. 另一个是 System.nanoTime() 返回 ...
- aix5.3安装httpd服务
1.安装gcc(1)从IBM上下载 gcc-4.0.0-1.aix5.3.ppc.rpm gcc-cplusplus-4.0.0-1.aix5.3.ppc.rpm libgcc-4.0.0-1.aix ...
- 白日梦的Elasticsearch笔记(一)基础篇
目录 一.导读 1.1.认识ES 1.2.安装.启动ES.Kibana.IK分词器 二.核心概念 2.1.Near Realtime (NRT) 2.2.Cluster 2.3.Node 2.4.In ...
- Jenkins-自动部署,备份
Jenkins-自动部署,备份 问题导入: 环境: CentOS 7, Tomcat 8.5, Jdk 1.8, Maven 3.25 ,Jenkins war包 2.x 原因: 每次部署 ...
- tensorflow安装使用过程错误及解决方法
tensorflow2.x 使用过程中常见错误(持续更新) 安装配置,使用tensorflow训练模型,转换为tflite模型,并部署与移动端过程中,虽然不难,但是也常出现一些莫名其妙的问题,下面简单 ...
- Haproxy-1.8.20 根据路径(URI)转发到后端不同集群
HAProxy根据不同的URI 转发到后端的服务器组 1 ) 实验内容说明: 1.1 ) 根据不同的URI 转发到后端的服务器组. /a /b 和其他 默认使用其他. 1.2 ) 使用IP介绍: ha ...