不同.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

辅助功能改进和修复

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

  • DataGridGridView列宽可以使用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 开始,其实现已被删除,以防止这些安全风险。 使用时 BinaryFormatterPlatformNotSupportedException 将引发异常。

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。

解决了ScrollViewerContextMenu的本地化问题。

用于 System.XamlWindowsBase 的单元测试超过 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

相关推荐
海盗12341 小时前
WPF使用内置资源系统实现国际化
wpf
余衫马2 小时前
Microsoft Semantic Kernel 入门指南
人工智能·microsoft·.net·agent·智能体
Rotion_深2 小时前
WPF UserControl 和 CustomControl
wpf
SEO-狼术2 小时前
Run Secure SFTP Across Every Platform
pdf·wpf
c#上位机18 小时前
wpf之RadialGradientBrush径向渐变画刷
wpf
码农学院1 天前
itextsharp .net中如何设置两个表格的间距设为0,取网站的域名,协议、端口、当前站点目录的地址
开发语言·c#·.net
不懂的浪漫1 天前
OpenTelemetry 和 SkyWalking Agent 怎么选?一次讲清 OTel、SkyWalking Agent 的相同点与区别
wpf·skywalking·链路追踪·opentelemetry·otel
c#上位机1 天前
wpf之LinearGradientBrush线性渐变
wpf
步步为营DotNet1 天前
深挖.NET 11:.NET Aspire 引领云原生开发新高度
云原生·.net