本文翻译自Igor的文章,原文地址:https://devblogs.microsoft.com/dotnet/whats-new-in-windows-forms-runtime-in-net-5-0/#listview-enhancementsgit
自从2018年末 Windows Forms开源并移植到.net core以后,内外部的开发团队就忙于修复旧的bug和增长新的特性。本文将讨论一下.NET5.0中Windows Forms运行时的新增功能。github
如今Windows Forms最使人兴奋的事情多是咱们在GitHub上拥有的活跃的社区。许多新特性和加强功能都是由咱们的社区成员建议的,甚至是彻底由他们实现的。在.NET5.0运行框架内,咱们已经接受并合并了900多个请求,其中70%以上的变动请求来自咱们的社区。windows
向 @hughbe, @gpetrou, @weltkante, @kpreisser 和许多帮助咱们改进Windows Forms运行时的人员表示感谢,并为之欢呼。api
下面是咱们从社区贡献者收到的一些例子数组
任务对话框是一个用于显示信息并接收用户简单输入的对话框,它比消息框有更多的特性,与消息框同样,它由操做系统根据你设置的参数进行格式化。安全
该控件由 @kpreisser贡献 | 控件说明文档 | 任务对话框使用例子app
Windows Forms开发人员对于ListView控件很是熟悉,可是对于在windows Vista添加的多个功能(如可折叠组,组任务,字幕和页脚等),ListView并无可供轻易调用的Api。框架
在.NET 5.0中,咱们填补了这一块API的空白,如今Windows Forms ListView与本机Win32控件更接近于等价。工具
新的API包括:post
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中,咱们进行了许多改进,包括但不限于如下方面
咱们还修复了几个因为工具致使影响用户体验的问题。例如,咱们从新设计访问性,使得访问一个可访问的对象时,再也不过早地建立句柄,以保证控件操做的可预测性,避免在界面上出现意外状况。
咱们还改进和纠正了多个控件(例如PropertyGrid和MonthCalendar)中的操做,避免操做这些工具时没法正常导航到UI,甚至严重状况下致使应用程序崩溃。
.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支持”意味着不少方面的内容。 咱们计划继续进行“花生酱”优化、可访问性改进、可空引用类型注释和常规代码改进。