不同.NET版本中的WPF新增功能

.NET Core的出现

2018年06月,微软发布了.NET Core 1.0

.NET Core 是一个开源的、跨平台的 .NET 实现,是新一代.NET的基石,支持Windows, Linux, macOS, 以及Docker。

这是微软开源的一大步。

微软现任 CEO Satya Nadella 主导全面拥抱开源,提出 Microsoft ♥ Linux 理念,推动微软从封闭生态转向开放战略,直接促成了开源跨平台 .NET Core 的横空出世。

.NETConf2019大会上,微软发布了.NET Core 3.0稳定版。.NET Core 从 3.0 开始正式支持 WPF和Winforms

一直到现在的.NET 10(正式版)/.NET 11预览版,WPF加入了不少新功能。

下面我们看一下从.NET Core 3.1到.NET 10,WPF新增加了哪些功能

.NET Core 3.0

开始支持WPF

.NET Core 3.1

WPF设计器作为Visual Studio 2019的一部分,不过那会的使用体验真的不太行,例如无法通过右键菜单从代码跳转到XAML。稳定性也不行。

.NET Core 5.0

XAML 设计器功能升级优化

.NET 6(.NET Core 5.0后面的版本改名为.NET)

提升热重载功能性能,加速热重载显示。

关于热重载,可以参考这篇文章

https://www.cnblogs.com/zhaotianff/p/11636787.html

.NET 7

性能改进

WPF for .NET 7 中的许多改进都集中在性能上,例如:

  • 尽可能避免进行装箱和拆箱操作。
  • 避免在堆上分配不必要的对象。
  • 重复使用 StringBuilder 实例,不要创建新实例。
  • 在不需要时停止使用 StringBuilder 。

辅助功能改进和修复

为控件添加了更多的键盘交互操作。

  • DataGrid和GridView列宽可以使用Alt + 左箭头键/右箭头键进行调整。
  • 为 DataGrid该列启用排序后,可以使用 F3 对列进行排序。
  • 现在,屏幕上的旁白会正确播报可勾选的菜单项。

故障修复

虽然 WPF 在 .NET Framework 上仍然完全受支持和服务,但大多数修补程序和所有新功能主要在 .NET 进行,在那里我们有机会进行更大的更改。 WPF 社区帮助解决了此版本中一些长期存在的 bug:

详细功能更新介绍链接:

https://devblogs.microsoft.com/dotnet/wpf-on-dotnet-7/

.NET 8

硬件加速

以前,远程访问的所有 WPF 应用程序必须使用软件呈现,即使系统具有硬件呈现功能。 .NET 8 添加了一个选项,允许你选择使用远程桌面协议(RDP)的硬件加速。

硬件加速是指使用计算机的图形处理单元(GPU)加快应用程序中图形和视觉效果的呈现。 这可以提高性能和更无缝的响应式图形。 相比之下,软件呈现只依赖于计算机的中央处理单元(CPU)来呈现图形,这可能会变慢且效率更低。

要选择加入,请在 Switch.System.Windows.Media.EnableHardwareAccelerationInRdp 文件中,将 true 配置属性设置为 。

打开文件夹对话框

WPF 包含名为 OpenFolderDialog 的新对话框控件。 此控件允许用户浏览和选择文件夹。 以前,应用开发人员依赖于第三方软件来实现此功能。

这个功能在WPF出现的这么多年,也算是加进来了。

此前,大部分是借助System.Windows.Forms.dll类库提供的功能

复制代码
 1 var openFolderDialog = new OpenFolderDialog()
 2 {
 3     Title = "Select folder to open ...",
 4     InitialDirectory = Environment.GetFolderPath(
 5         Environment.SpecialFolder.ProgramFiles)
 6 };
 7 
 8 string folderName = "";
 9 if (openFolderDialog.ShowDialog())
10 {
11     folderName = openFolderDialog.FolderName;
12 }

详细的功能更新介绍可以访问以下链接:

https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/whats-new/net80

.NET 9.0

加入Fluent主题,这个功能可以参考前面的文章

https://www.cnblogs.com/zhaotianff/p/19952424

基于连字符的连字功能支持

WPF 从未在 UI 控件(如 TextBlock)中支持基于连字符的连字。 这个长期存在的社区要求已在 .NET 9 中添加。

这是未应用于 .NET 8 字形的连字的图像。

现在,在 .NET 9 中呈现的文本如下:

不再支持 BinaryFormatter

BinaryFormatter 被视为不安全,因为它容易受到反序列化攻击,这可能导致拒绝服务(DoS)、信息泄露或远程代码执行。 它在反序列化漏洞被充分理解之前实现,其设计不遵循现代安全最佳做法。

从 .NET 9 开始,其实现已被删除,以防止这些安全风险。 使用时 BinaryFormatter , PlatformNotSupportedException 将引发异常。

WPF在许多场景中使用BinaryFormatter,例如在剪贴板和拖放操作的数据序列化时。 在内部,WPF 继续使用更安全的 BinaryFormatter 子集来处理具有已知类型集的特定用例。

关于序列化,可以参考前面的文章

https://www.cnblogs.com/zhaotianff/p/17402238.html

详细的功能更新介绍可以访问以下链接:

https://learn.microsoft.com/en-us/dotnet/desktop/wpf/whats-new/net90

.NET 10.0

性能改进

通过将内部数据结构替换为基本 .NET 类型(例如 ReadOnlyCollection<T>),提高了性能。 这最大限度地减少了 UI 自动化和文件对话框中的分配,并加快了像素格式转换的速度。

通过优化缓存作、数组处理以及将字体集合加载程序迁移到托管代码来提高性能。

针对字体呈现、动态资源、输入合成、跟踪日志记录、正则表达式使用情况和 XAML 分析优化了性能。

Fluent主题样式更改

.NET 10 中已解决了各种 bug,以改进对 WPF 中 Fluent UI 样式的支持。 Fluent UI 样式支持仍在进行中。

剪贴板更改

WPF 和 Windows 窗体现在使用相同的剪贴板 API。 这两种桌面技术统一了它们与剪贴板的交互方式。

.NET 9 已将 BinaryFormatter弃用,它用于某些剪贴板操作。 这些剪贴板操作要求你选择启用兼容包,或者解决操作相关的问题。 为了减轻从 BinaryFormatter迁移的困难,.NET 10 将废弃某些剪贴板方法,以表明它们不应再被使用。 我们正在添加更多方法来帮助用户使用剪贴板数据进行 JSON 序列化,从而避免对 BinaryFormatter 的需求。

故障修复

解决了各种问题,包括 UI 元素游标类型、当位图流为空时的崩溃问题、生成和测试步骤的错误,以及 BitmapMetadata 和本机依赖项中的小 bug。

解决了ScrollViewer和ContextMenu的本地化问题。

用于 System.Xaml 和 WindowsBase 的单元测试超过 4,000 个。

通过优化缓存作、数组处理以及将字体集合加载程序迁移到托管代码来提高性能。

代码清理

由于迁移出 .NET Framework 环境,导致与代码访问安全性(CAS)相关的属性和代码没有被使用。 其中许多已在 .NET 代码库中删除。

  • 从所有库中删除未使用的 CAS 资源字符串及其翻译。
  • 从 OleCmdHelper/ISecureCommand中删除未使用的 CAS 和 XBAP 代码。
  • 从 FontSourceCollection/FontSource中删除未使用的 CAS 代码。

进行了广泛的代码清理,包括语法标准化和参数清晰度,以提高代码可读性和可维护性。 调试模式已现代化,旧构造(如 ArrayList 已逐步淘汰)以保持可维护性。

新 API

MessageBox

社区贡献者 bstordrup 为 MessageBox 提供了更多按钮和结果选项的增强。 有关详细信息,请参阅 #9613。

复制代码
 1 namespace System.Windows
 2 {
 3     public enum MessageBoxButton
 4     {
 5         OK = 0,
 6         OKCancel = 1,
 7 +       AbortRetryIgnore = 2,
 8         YesNoCancel = 3,
 9         YesNo = 4,
10 +       RetryCancel = 5,
11 +       CancelTryContinue = 6,
12     }
13 
14     public enum MessageBoxResult
15     {
16         None = 0,
17         OK = 1,
18         Cancel = 2,
19 +       Abort = 3,
20 +       Retry = 4,
21 +       Ignore = 5,
22         Yes = 6,
23         No = 7,
24 +       TryAgain = 10,
25 +       Continue = 11,
26     }
27 }

Grid控件升级

社区参与者 dotMorten 增强了 Grid 行和列定义属性,以支持基于字符串的短格式语法。 如下所示:

复制代码
 1 <Grid>
 2     <Grid.ColumnDefinitions>
 3           <ColumnDefinition Width="1*" />
 4           <ColumnDefinition Width="2*" />
 5           <ColumnDefinition Width="Auto" />
 6           <ColumnDefinition Width="*" />
 7           <ColumnDefinition Width="300" />
 8     </Grid.ColumnDefinitions>
 9     <Grid.RowDefinitions>
10           <RowDefinition Height="1*" />
11           <RowDefinition Height="Auto" />
12           <RowDefinition Height="25" />
13           <RowDefinition Height="14" />
14           <RowDefinition Height="20" />
15     </Grid.RowDefinitions>
16 </Grid>
复制代码

现在可以按如下所示编写:

复制代码
1 <Grid ColumnDefinitions="1*, 2*, Auto, *, 300" RowDefinitions="1*, Auto, 25, 14, 20" />

.NET 11 Preview 3

故障修复

  • WPF现在可防范桌面窗口管理器(DWM)故障导致的崩溃。
  • Windows 10上的 Fluent 窗口背景和幕布问题已修复。
  • 修复了在启用 EnableWeakEventMemoryImprovements 的情况下,当 WeakEventTable.Purge 在枚举期间修改数据表时发生的 InvalidOperationException。 表更新现在在清除期间延迟,以避免使枚举器失效。

参考链接:

https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/whats-new/?source=recommendations

相关推荐
一个天蝎座 白勺 程序猿17 小时前
IoTDB集群扩容:从慌乱到从容的经验分享
数据库·wpf·时序数据库·iotdb
xiangcns1 天前
PDMS PiplineTool(三十)一堆小优化+一个彩蛋功能
.net·二次开发·pdms
samble2 天前
从零搭建灌装监控系统(十三):报警系统设计,生命周期与通知
c#·wpf·mvvm·modbus·工业控制
EatFan2 天前
MCP 从概念到落地:Java(Spring AI Alibaba)与 .NET 双栈接入实操对比
java·人工智能·后端·spring·.net·java后端·mcp
samble2 天前
从零搭建灌装监控系统(十二):配置系统,原子写入与容错
c#·wpf·mvvm·modbus·工业控制
CSharp精选营3 天前
.NET 面试必问的 8 道 GC 题,建议收藏
.net·面试题·gc·c#面试题
驰骋工作流4 天前
C#/.NET 开源BPM工作流引擎6大常用对比选型分析驰骋BPM驰骋低代码低代码工作流引擎
开源·c#·.net
淡海水4 天前
02-02-原理篇-分代GC
算法·unity·c#·游戏引擎·.net·gc
1-1=05 天前
.NET 依赖注入 续
.net