.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:
- 无法全局覆盖 FocusVisualStyle
- CommandParameter 使 CanExecute 失效
- .NET 6 工具提示行为从 .NET 5 更改(bug?)
- 组合框项工具提示错误
- 如果从可视化树中删除其所有者,ContextMenu 将停止工作
- 修复了字形运行序列化过程中出现的舍入误差
详细功能更新介绍链接:
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 样式支持仍在进行中。
-
Fluent 样式添加了更多控件,例如:
-
修复了 Expander 的动画。
-
修复了与
HighContrast相关的崩溃问题。 -
为控件添加了遗漏的 RecognizesAccessKey 标记。
-
已修复MenuItem、Expander和TreeViewItem从右到左布局的问题。
剪贴板更改
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