本文翻译自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. JMeter断言/检查点

    断言就类似LoadRunner中的检查点.对上一个请求返回的信息,获取部分字符串.图片等做判断,确保返回的信息的准确性. 右键点击"HTTP请求" -> "添加&q ...

  2. .NET 开源导入导出库 Magicodes.IE 2.5发布

    今天我们发布了2.5版本,这当然也离不开大家对Magicodes.IE的支持,今天我也是跟往常一样列举了该版本一些重要的更新内容. 当然也要说一下,在这个版本中我们设计了全新的LOGO Excel导出 ...

  3. Java基础学习之异常处理(6)

    @ 目录 1.异常是什么 1.1.Error 1.2.Exception 2.异常处理机制 2.1.捕获异常 2.2.抛出异常 3.自定义异常 3.1.自定义检查性异常 3.2.自定义运行时异常 1. ...

  4. Ubuntu 16.04 系统基础开发环境搭建

    1.安装 Git sudo apt-get update sudo apt-get install git Do you want to continue? [Y/n] Y git --version ...

  5. 最简 Spring IOC 容器源码分析

    前言 BeanDefinition BeanFactory 简介 Web 容器启动过程 bean 的加载 FactoryBean 循环依赖 bean 生命周期 公众号 前言 许多文章都是分析的 xml ...

  6. 自搭建jetbrains系列ide授权服务器

    1.下载 LicenseServer 地址:https://mega.nz/#!7B5UVY6b!Hae2ceTBPIrTowQN0sV9fQ5lGOKzGxas2ug02RZAdGU,里面有不同的服 ...

  7. Oracle 要慌了!华为终于开源了自家的 Huawei JDK——毕昇 JDK!

    没错,自阿里.腾讯之后,华为也终于开源了自家的 JDK--毕昇 JDK! 免费!免费!免费!!! Oracle 要慌了? 毕昇 JDK 毕昇 JDK 是华为内部 OpenJDK 定制版 Huawei ...

  8. 跨站点脚本编制 - SpringBoot配置XSS过滤器(基于mica-xss)

    1. 简介   XSS,即跨站脚本编制,英文为Cross Site Scripting.为了和CSS区分,命名为XSS.   XSS是最普遍的Web应用安全漏洞.这类漏洞能够使得攻击者嵌入恶意脚本代码 ...

  9. centos7安装zabbix server5.0

    安装zabbix源 1.rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarc ...

  10. python 类和方法(面向对象)

    类和方法 name = "Jack" city = "bejing" print("my name is %S and come from %s &q ...