本文翻译自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组标题图像

@hughbe@lonitra贡献| 说明文档

FileDialog

FileDialog已收到新的API :FileDialog.ClientGuid。

该api使得调用者能让一个将一个GUID和Windows文件对话框的持久状态关联起来。一个对话框的状态可以包括诸如上次访问的文件夹以及对话框的位置和大小之类的因素。一般来说,此状态是通过可执行文件的名称进行持久化的。通过指定GUID,对于同一应用程序中不同版本的对话框,应用程序可以具有不同的持久状态(例如,导入对话框和打开的对话框)。

@ jnm2提供说明文档

性能提升

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运行时的新功能(翻译)的更多相关文章

  1. Javassist之使用字节码在运行时生成新的类 01

    介绍 Javassist是一个开源的分析.编辑和创建Java字节码的类库.是由东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的.它已加入了开放源代码JBoss 应用 ...

  2. VC++中的C运行时库浅析(控制台程序默认使用单线程的静态链接库,而MFC中的CFile类已暗藏了多线程)

    1.概论 运行时库是程序在运行时所需要的库文件,通常运行时库是以LIB或DLL形式提供的.C运行时库诞生于20世纪70年代,当时的程序世界还很单纯,应用程序都是单线程的,多任务或多线程机制在此时还属于 ...

  3. java中检测-在运行时指定对象是否是特定类的一个实例---关键字 instanceof

    java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. if(requ ...

  4. WSS存储服务器(Windows Storage Server) 2012新功能解析

    虽然最近一段时间有关微软的新闻大多数集中在Windows 8以及Surface平板设备身上,但数周之前Windows Server 2012新版本中所包含的Windows Storage Server ...

  5. Windows 8.1 Preview的新功能和新API

    http://msdn.microsoft.com/en-us/library/windows/apps/bg182410 App打包 新的App程序包将使App的提交更简单.资源包可以让你提供附加的 ...

  6. eclipse中的项目运行时不出现run as→java application选项

    eclipse中的运行java project时不出现run as→java application选项? 解决方案☞必须有正确的主方法,即public static void main(String ...

  7. IDEA 中scala 程序运行时的错误:报错 test is already defined as object test

    解决办法:在 创建main文件夹和scala文件夹的时候,注意src与这两个文件夹不能同时设置为resources,否则就会产生报错,解决办法将src文件夹的resources取消,右键.

  8. eclipse中如何关闭运行时自动保存?

    Eclipse没有提供自动保存的功能,只能自己写脚本每隔多久保存一次,或监听修改即保存.设置方法:1.打开:preferences>run/debug>launching2.选择save ...

  9. Windows Community Toolkit 3.0 新功能 在WinForms 和 WPF 使用 UWP 控件

    本文告诉大家一个令人震惊的消息,Windows Community Toolkit 有一个大更新,现在的版本是 3.0 .最大的提升就是 WinForm 和 WPF 程序可以使用部分 UWP 控件. ...

随机推荐

  1. PyQt学习随笔:QWidget的QFont的kerning、Antialiasing属性用途

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 引言 在Designer中,QWidget的font属性有两个比较陌生 ...

  2. PyQt(Python+Qt)学习随笔:QTabWidget选项卡部件的documentMode属性作用

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTabWidget的documentMode属性用于控制是否以适合文档页的模式呈现选项卡部件.这与 ...

  3. 转:浅析windows下字符集和文件编码存储/utf8/gbk

    最近老猿在学习文件操作及网络爬虫相关知识,发现字符集及编码的处理非常重要,而老猿原来对此了解并不多,因此找了几篇文章看了一下,将老猿认为比较的相关文章转载一下.感谢各位原创大神! 1,字符集 这里主要 ...

  4. 再次学习sql注入

    爆所有数据库 select schema_name from information_schema.schemata 先爆出多少个字段 id = 1 order by ?; mysql5.0及以上 都 ...

  5. LeetCode初级算法之数组:136 只出现一次的元素

    只出现一次的元素 题目地址:https://leetcode-cn.com/problems/single-number/ 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找 ...

  6. FirstCode异常 此引用关系将导致不允许的周期性引用

    FirstCode异常 此引用关系将导致不允许的周期性引用 一般由多表里的外键互相引用引起. 解决方法: 1.去掉对应数据类里的外键对应的对象属性. 2.去掉该外键. [Table("TAs ...

  7. 最简 Spring AOP 源码分析!

    前言 最近在研究 Spring 源码,Spring 最核心的功能就是 IOC 容器和 AOP.本文定位是以最简的方式,分析 Spring AOP 源码. 基本概念 上面的思维导图能够概括了 Sprin ...

  8. DVWA各等级sql注入

    sql全等级注入 level:low <?php if( isset( $_REQUEST[ 'Submit' ] ) ) { //判断submit是否存在 // Get input $id = ...

  9. 实验:非GTID 级联复制架构变为一主多从

  10. 从函数到包的Python代码层次

    代码层次 Python是一门脚本语言,新建一个.py文件,写点代码,就可以跑起来了,无论放哪都可以.比如where.py文件: print("Where am I?") 那么问题来 ...