本文翻译自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. 老猿学5G:多量纲计费与QoS的QCI、5QI、ARP、GBR和MBR

    ☞ ░ 前往老猿Python博文目录 ░ 一.多量纲计费 多量纲计费是与传统的计费模式相区别的一种计费模式,传统的计费基本上都是通过使用量.使用时长或包固定时长等方式计费,而多量纲计费是指在考虑以上方 ...

  2. PyQt(Python+Qt)学习随笔:QTableWidget的takeItem和sortItems方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTableWidget中的takeItem方法从表格中取并去除项,sortItems方法对表格中的 ...

  3. PyQt(Python+Qt)学习随笔:model/view架构中的QStringListModel

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.QStringListModel介绍 QStringListModel是Qt提供的一个已经实现Q ...

  4. 题解-FJOI2014 树的重心

    FJOI2014 树的重心 \(Q\) 组测试数据.给一棵树大小为 \(n\),求有多少个子树与其重心相同.重心可能有多个. 数据范围:\(1\le Q\le 50\),\(1\le n\le 200 ...

  5. 深入理解Java虚拟机(七)——类文件结构

    Java的无关性 由于计算机领域中有很多操作系统和硬件平台同时在竞争,所以,很多编程语言的程序设计会与其运行的平台和操作系统产生耦合,这样就大大增加了程序员的工作,为了适应不同的平台,需要修改很多代码 ...

  6. 主从复制架构直接转换MGR(manual)

    环境信息 IP port role info 192.168.188.81 3316 node1 master 192.168.188.82 3316 node2 slave1 192.168.188 ...

  7. 有了Git这个功能,再也不需要依赖IDE了!

    大家好,今天给大家介绍一个隐藏的功能--搜索. 我们在写代码的时候经常遇到的一种情况就是,我们想要知道某一个函数是怎么定义的,这样我们才能知道该如何调用它.如果代码少的话我们当然可以自己人肉查找,但是 ...

  8. JavaSE09-(练手)简易学生管理系统

    1.学生管理系统实现步骤 案例需求 系统主要功能如下: 添加学生:通过键盘录入学生信息,添加到集合中 删除学生:通过键盘录入要删除学生的学号,将该学生对象从集合中删除 修改学生:通过键盘录入要修改学生 ...

  9. vue 表单基本 表单修饰符

    表单的基础 利用v-model进行双向数据绑定: 1.在下拉列表中,将v-model写在select中 2.单选框和复选框需要每个按钮都需要写上v-model 3.v-model在输入框中获取得是输入 ...

  10. matplotlib的学习8-scatter散点图

    import matplotlib.pyplot as plt import numpy as np n = 1024 # data size #生成1024个呈标准正太分布的二维数组(平均数为0,方 ...