.Net 5中Windows Forms运行时的新功能(翻译)
本文翻译自Igor的文章,原文地址:https://devblogs.microsoft.com/dotnet/whats-new-in-windows-forms-runtime-in-net-5-0/#listview-enhancements
自从2018年底 Windows Forms开源并移植到.net core之后,内外部的开发团队就忙于修复旧的bug和增加新的特性。本文将讨论一下.NET5.0中Windows Forms运行时的新增功能。
新增和加强的Windows控件
现在Windows Forms最令人兴奋的事情可能是我们在GitHub上拥有的活跃的社区。许多新特性和增强功能都是由我们的社区成员建议的,甚至是完全由他们实现的。在.NET5.0运行框架内,我们已经接受并合并了900多个请求,其中70%以上的变更请求来自我们的社区。
向 @hughbe, @gpetrou, @weltkante, @kpreisser 和许多帮助我们改进Windows Forms运行时的人员表示感谢,并为之欢呼。
下面是我们从社区贡献者收到的一些例子
新的任务进度对话框控件

任务对话框是一个用于显示信息并接收用户简单输入的对话框,它比消息框有更多的特性,与消息框一样,它由操作系统根据你设置的参数进行格式化。
该控件由 @kpreisser贡献 | 控件说明文档 | 任务对话框使用例子
ListView控件的加强功能
Windows Forms开发人员对于ListView控件非常熟悉,但是对于在windows Vista添加的多个功能(如可折叠组,组任务,字幕和页脚等),ListView并没有可供轻易调用的Api。
在.NET 5.0中,我们填补了这一块API的空白,现在Windows Forms ListView与本机Win32控件更接近于等价。
新的API包括:
- ListView组折叠/展开
- ListView组页脚
- ListView组字幕
- ListView组任务
- ListView组标题图像

FileDialog
FileDialog已收到新的API :FileDialog.ClientGuid。
该api使得调用者能让一个将一个GUID和Windows文件对话框的持久状态关联起来。一个对话框的状态可以包括诸如上次访问的文件夹以及对话框的位置和大小之类的因素。一般来说,此状态是通过可执行文件的名称进行持久化的。通过指定GUID,对于同一应用程序中不同版本的对话框,应用程序可以具有不同的持久状态(例如,导入对话框和打开的对话框)。
性能提升
Windows Forms一直被认为围绕Win32 API集的托管包装。因此,Windows Forms始终严重依赖于互操作层与非托管Windows组件通信。.NET Core早期的头等大事是优化我们的互操作层,使结构更加稳定,显式选择更有效的“ W”功能,并尽量使用“不安全”代码。所有这些更改都是我们所谓的“花生酱更改”:从某种意义上说,每个更改都是很小的,几乎是不可观察的,但是在应用程序的整个生命周期中,这些更改加起来可带来性能提升是可观的。
在.NET 5.0中,我们提高了标准,并优化了一些绘制路径。以前的Windows Forms依靠GDI +(和某些GDI)来进行渲染操作。尽管GDI +比GDI更易于使用,因为它通过Graphics对象抽象了设备上下文(具有有关特定显示设备信息的结构,例如监视器或打印机的信息),但也因为额外的开销导致很慢。因此在处理纯色和画笔的许多情况下,我们选择使用GDI。
我们还使用了IDeviceContext接口扩展了一些与渲染相关的API(例如PaintEventArgs),尽管它们可能无法直接提供给Windows Forms开发人员使用,但它让我们绕过GDI +Graphics对象,从而减少内存分配并提高速度。这些优化表明,在重绘路径中显著地减少了内存消耗,在某些情况下甚至节省了10倍的内存分配。

更多的技术细节就可以查看的API Review 部分,或观看 Jeremy Kuhne在 .NET Community Standup 里讨论的优化内容。
您也可以从这里获取测试项目:https://github.com/JeremyKuhne/RedrawPerformance,然后自己验证结果

最后同时也比较重要的一点,我们已经扩展了TextRendererAPI以接受ReadOnlySpan的重载,因为绘制和测量文本是很常见的操作。
当避免给新的字符串分配内存时(比如把字符串按分割符分成一个字符数组), 这样可以显著地提高文本渲染的效率。
可访问性的改进和修复
在过去的几年中,该团队一直在更新具有20年历史的Windows Forms SDK,以满足当今的可访问性要求和规范。
在.NET 5.0中,我们进行了许多改进,包括但不限于以下方面
- UI 自动化对一些控件的支持,包括:Button,ListView,CheckBox,RadioButton等
- LegacyIAccessible控件模式支持使客户端能够更好地与UI控件进行交互,并允许开发人员为控件设置自定义“可访问角色”属性。
- Text和TextRange控件模式支持使客户端能够从文本控件的文本内容,文本属性和嵌入式对象中进行文本检索。

我们还修复了几个由于工具导致影响用户体验的问题。例如,我们重新设计访问性,使得访问一个可访问的对象时,不再过早地创建句柄,以保证控件操作的可预测性,避免在界面上出现意外情况。
我们还改进和纠正了多个控件(例如PropertyGrid和MonthCalendar)中的操作,避免操作这些工具时无法正常导航到UI,甚至严重情况下导致应用程序崩溃。
Visual Basic支持
.NET 5和Visual Studio 16.8也支持基于.Net Framework的Visual Basic!Visual Studio 16.8包括Windows Forms设计器,因此Visual Basic也已准备就绪,可以迁移现有应用程序或创建新应用程序。
有关更多信息,请参考 Visual Basic WinForms Apps in .NET 5 and Visual Studio 16.8 post.。
同时感谢对@ paul1956帮助我们处理使用Visual Basic相关问题。
重大变化
尽管我们打算尽可能保持与.NET Framework和.NET Core的向后兼容性,但并不是总是有效的。您可以在此处找到重大更改的列表:
有关已知问题的列表,请参考 .NET 5.0 Known Issues document.。
展望未来
我们知道,当前对高DPI的支持还远远不够,这是我们计划在.NET 6.0的时间范围内进行改进。“高DPI支持”意味着很多方面的内容。 我们计划继续进行“花生酱”优化、可访问性改进、可空引用类型注释和常规代码改进。
.Net 5中Windows Forms运行时的新功能(翻译)的更多相关文章
- Javassist之使用字节码在运行时生成新的类 01
介绍 Javassist是一个开源的分析.编辑和创建Java字节码的类库.是由东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的.它已加入了开放源代码JBoss 应用 ...
- VC++中的C运行时库浅析(控制台程序默认使用单线程的静态链接库,而MFC中的CFile类已暗藏了多线程)
1.概论 运行时库是程序在运行时所需要的库文件,通常运行时库是以LIB或DLL形式提供的.C运行时库诞生于20世纪70年代,当时的程序世界还很单纯,应用程序都是单线程的,多任务或多线程机制在此时还属于 ...
- java中检测-在运行时指定对象是否是特定类的一个实例---关键字 instanceof
java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. if(requ ...
- WSS存储服务器(Windows Storage Server) 2012新功能解析
虽然最近一段时间有关微软的新闻大多数集中在Windows 8以及Surface平板设备身上,但数周之前Windows Server 2012新版本中所包含的Windows Storage Server ...
- Windows 8.1 Preview的新功能和新API
http://msdn.microsoft.com/en-us/library/windows/apps/bg182410 App打包 新的App程序包将使App的提交更简单.资源包可以让你提供附加的 ...
- eclipse中的项目运行时不出现run as→java application选项
eclipse中的运行java project时不出现run as→java application选项? 解决方案☞必须有正确的主方法,即public static void main(String ...
- IDEA 中scala 程序运行时的错误:报错 test is already defined as object test
解决办法:在 创建main文件夹和scala文件夹的时候,注意src与这两个文件夹不能同时设置为resources,否则就会产生报错,解决办法将src文件夹的resources取消,右键.
- eclipse中如何关闭运行时自动保存?
Eclipse没有提供自动保存的功能,只能自己写脚本每隔多久保存一次,或监听修改即保存.设置方法:1.打开:preferences>run/debug>launching2.选择save ...
- Windows Community Toolkit 3.0 新功能 在WinForms 和 WPF 使用 UWP 控件
本文告诉大家一个令人震惊的消息,Windows Community Toolkit 有一个大更新,现在的版本是 3.0 .最大的提升就是 WinForm 和 WPF 程序可以使用部分 UWP 控件. ...
随机推荐
- c++11-17 模板核心知识(十五)—— 解析模板之依赖型类型名称与typename Dependent Names of Types
模板名称的问题及解决 typename规则 C++20 typename 上篇文章c++11-17 模板核心知识(十四)-- 解析模板之依赖型模板名称 Dependent Names of Templ ...
- flex:align-items和align-content的区别
属性值 align-items的属性值有:baseline.center.flex-end.flex-start.stretch.inherit.initial.unset align-content ...
- 如何配置nginx达到只允许域名访问网址,禁止ip访问的效果
需求:接入阿里云的waf对网站进行防护,但是如果直接通过IP地址访问网站即可绕过阿里云waf,于是希望禁止通过ip访问网站 修改nginx配置文件 在server段里插入如下内容即可 if ($hos ...
- js下 Day03、DOM操作--节点方法
语法:parentNode.appendChild(child) 功能:向父节点的子节点列表的末尾添加新的子节点 语法:parentNode.removeChild(child) 功能:从子节点列表中 ...
- [日常摸鱼]bzoj1001狼抓兔子-最大流最小割
题意就是求最小割- 然后我们有这么一个定理(最大流-最小割定理 ): 任何一个网络图的最小割中边的容量之和等于图的最大流. (下面直接简称为最大流和最小割) 证明: 如果最大流>最小割,那把这些 ...
- [日常摸鱼]bzoj3224普通平衡树-Treap、Splay、01Trie、替罪羊树…
http://www.lydsy.com/JudgeOnline/problem.php?id=3224 经典的平衡树模板题-各种平衡树好像都可以(黄学长之前好像还用vector卡过了这题) 所以这篇 ...
- 大白话详解大数据hive知识点,老刘真的很用心(3)
前言:老刘不敢说写的有多好,但敢保证尽量用大白话把自己复习的内容详细解释出来,拒绝资料上的生搬硬套,做到有自己的了解! 1. hive知识点(3) 从这篇文章开始决定进行一些改变,老刘在博客上主要分享 ...
- 微服务痛点-基于Dubbo + Seata的分布式事务(AT)模式
前言 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.Seata 将为用户提供了 AT.TCC.SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案. ...
- Docker 快速部署 Django项目到云服务器
项目结构: 1,dockerfile FROM python:3.7 RUN mkdir -p /usr/src/app WORKDIR /usr/src/app COPY pip.conf /roo ...
- C# Wpf 后台代码设定UIElement的Canvas位置属性值
后台in-code设定元件UIElement的Canvas位置属性的两种方法: 1.UIElement.SetValue()方法 uiElement.SetValue(Canvas.TopProper ...