.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 控件. ...
随机推荐
- PyQt学习随笔:自定义信号连接时报AttributeError: 'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 如果使用自定义信号,一定要记得信号是类变量,必须在类中定义,不能在实例 ...
- 第11.14节 正则表达式转义符和Python转义符相同引发问题的解决办法
正则表达式使用反斜杠('\')来把特殊字符转义成普通字符(为了方便称为"正则表达式转义"),而反斜杠在普通的 Python 字符串里也是转义符(称为"字符串转义" ...
- PyQt(Python+Qt)帮助文档官网及文档下载
一.帮助文档下载 老猿在网上找到一个Qt 5.9的帮助文档,没有找到最新版的,并且这个文档官网上没有下载,不知道源头在哪里可以下载. 文档存放在百度网盘: 链接:https://pan.baidu.c ...
- Android的intent
title: Android基础01 date: 2020-02-15 17:17:04 tags: 1.Intent Intent可以让活动进行跳转.使用方式有两种,一种是显式,另一种是隐式. 1. ...
- sql绕过小技巧
两个空格代替一个空格,用Tab代替空格,%a0=空格: %20 %09 %0a %0b %0c %0d %a0 %00 /**/ /*!*/ 最基本的绕过方法,用注释替换空格: /* 注释 */ 使用 ...
- kaggle——Bag of Words Meets Bags of Popcorn(IMDB电影评论情感分类实践)
kaggle链接:https://www.kaggle.com/c/word2vec-nlp-tutorial/overview 简介:给出 50,000 IMDB movie reviews,进行0 ...
- 「TJOI / HEOI2016」求和 的一个优秀线性做法
我们把\(S(i, j)j!\)看成是把\(i\)个球每次选择一些球(不能为空)扔掉,选\(j\)次后把所有球都扔掉的情况数(顺序有关).因此\(S(i, j)j! = i
Description 给定一张有向图,\(n\) 个顶点,\(m\) 条边.第 \(i\) 条边从 \(u_i\) 到 \(v_i\),走完该边的用时为 \(w_i\).每一个点有一个价值 \(c\ ...
- 不会吧不会吧,还有开发不会Java填充PDF模板数据的,赶紧看看吧
思路 根据业务需求,获取实际业务数据,借助itext库功能,将业务数据填充入提前制作好的PDF模板中 操作步骤 制作PDF模板:提前下载好Adobe Acrobat Pro DC 效果展示 准备PDF ...
- oracle 11g调优常用语句
1.查询表的基数及选择性 select a.column_name, b.num_rows, a.num_distinct cardinality, round( ...