C# / WPF 更新全景 2022–2026
包含内容:.NET 7 / 8 / 9 / 10 四个大版本、C# 11 → C# 14 语言特性、WPF 三年演进(Fluent 主题 → 控件补全) 目标读者:WPF 桌面开发者,尤其是正在做技术选型或版本升级决策的人 数据来源:Microsoft Learn《What's new in WPF》系列、.NET 官方支持策略页、.NET / C# 版本路线图 更新时间:2026 年 10 月
目录
- 一页速览
- 版本节奏与支持策略
- 时间轴 2022 → 2026
- WPF 逐版本演进(.NET 7 → 10)
- C# 语言特性地图(11 → 14)
- 代码示例(C# 14 与 WPF 亮点)
- 关键破坏性变更
- 升级路线建议(2026)
- 速查总表
- 图片与引文出处
一页速览
微软把 .NET 变成了每年 11 月一次的固定节奏:偶数年 LTS(3 年支持),奇数年 STS(2 年支持)。五年四代,语言从 C# 11 走到 C# 14,WPF 从"只修 bug"走到"换掉整套视觉系统"。
| 指标 | 数值 |
|---|---|
| 大版本 | 4 个(.NET 7 / 8 / 9 / 10) |
| C# 语言版本 | 4 个(C# 11 / 12 / 13 / 14) |
| 当前 LTS | .NET 10,支持至 2028.11 |
| WPF 最大单点变化 | .NET 9 的 Fluent 主题 + ThemeMode |
| 2026 年的默认答案 | 新项目上 .NET 10 |
1. 版本节奏与支持策略
理解这套节奏是理解整个更新全景的前提——三套版本号在同一个节奏上移动,但含义完全不同。
| 维度 | 含义 | 决定什么 |
|---|---|---|
运行时 net10.0 | .NET Runtime | BCL API 是否存在、JIT / GC 行为 |
语言 C# 14 | C# Language Version | 编译器接受哪些语法 |
SDK 10.0.x | .NET SDK | 捆绑哪个 Roslyn、默认语言版本 |
关键认知 语言与运行时相互独立:纯语法糖(主构造函数、集合表达式、
field关键字)只需要新编译器;而 Span 隐式转换、params Span、System.Threading.Lock等特性需要新的运行时 / BCL 支持,目标框架过低会编译失败或静默退化。 实际含义:<LangVersion>latest</LangVersion>能让你在老 TFM 上用新语法,但用不了新 API。
1.1 LTS 与 STS
| 类型 | 发布年份 | 支持时长 | 适用场景 |
|---|---|---|---|
| LTS(长期支持) | 偶数年(6 / 8 / 10) | 3 年 | 生产环境首选 |
| STS(标准支持) | 奇数年(7 / 9) | 2 年(.NET 9 起从 18 个月延长到 24 个月) | 尝鲜、试验新技术 |
- 两类版本质量完全相同,唯一区别是支持时长。
- 补丁固定在每月第二个星期二(Patch Tuesday)发布。
- 企业落地建议:生产项目只跟 LTS,STS 只用于验证——否则每 2 年就要被强制迁移一次。
下图把 6 个版本的支持窗口画在同一时间轴上,可以直观看出"什么时候必须动":
图 1:.NET 版本支持窗口(2021.11 – 2028.11)。绿色为 LTS、橙色为 STS,暗色表示已终止支持,虚线为当前时间点。
2. 时间轴 2022 → 2026
| 版本 | 发布时间 | 类型 | C# | 支持截止 | 一句话 |
|---|---|---|---|---|---|
| .NET 7 | 2022.11 | STS | C# 11 | 2024.05 ❌ | 原始字符串、required、泛型数学 |
| .NET 8 | 2023.11 | LTS | C# 12 | 2026.11 | 主构造函数、集合表达式、RDP 硬件加速 |
| .NET 9 | 2024.11 | STS | C# 13 | 2026.11 | params 集合、Lock、Fluent 主题 |
| .NET 10 | 2025.11 | LTS | C# 14 | 2028.11 | field、扩展块、文件级应用 |
| .NET 11 | 2026.11 | STS | C# 15 | 预览中 | 面向早期采用者与库作者 |
2.1 逐版本展开
.NET 7 · 2022.11 · STS · 已终止(2024.05)
- 语言:原始字符串字面量
"""、required成员、泛型数学、列表模式。 - 运行时:Native AOT(控制台预览)、容器发布、正则源生成器。
- WPF:性能优化(减少装箱 / 堆分配)+ 无障碍改进 + 一批社区 bug 修复,无新控件。
.NET 8 · 2023.11 · LTS · 支持至 2026.11
- 语言:主构造函数(全类型)、集合表达式
[a, b, ..spread]、ref readonly参数、内联数组。 - WPF 重点:RDP 硬件加速 + 新增
OpenFolderDialog文件夹选择对话框。 - 平台:Native AOT 从"能用"变成"好用",容器镜像体积明显下降。
.NET 9 · 2024.11 · STS · 支持至 2026.11
- 语言:
params集合、专用System.Threading.Lock、\e转义、部分属性 / 索引器。 - WPF 大年:Fluent 主题 +
ThemeMode、Windows 强调色、连字符连字。 - 破坏性:
BinaryFormatter被移除。
.NET 10 · 2025.11 · LTS · 支持至 2028.11
- 语言:
field关键字、扩展块(extension members)、文件级应用、空条件赋值。 - WPF:性能优化、Fluent 补全 9 个控件、
MessageBox新增枚举、Grid字符串简写、剪贴板统一。 - 平台:JIT 内联 / 去虚化、AVX10.2、后量子加密、Microsoft Agent Framework(AI)。
.NET 11 · 2026.11 · STS · 预览中
- C# 15 预览;面向早期采用者与库作者,2026 年 11 月 GA 后转为 STS。
3. WPF 逐版本演进(.NET 7 → 10)
先说明 WPF 的更新是按 .NET 版本走的,各版本内容量差别很大。本节严格依据 Microsoft Learn 官方《What's new in WPF》系列文档逐个版本列举,不做合并或推测。
先看整体分布——六个能力域、四个版本,一眼能看出钱花在哪:
图 2:WPF 能力域 × 版本演进矩阵。色块越亮 = 该版本投入越大;★ 为年度标志性更新;! 为需迁移的破坏性变更。
3.1 .NET 7 · 性能 + 无障碍
本版本 WPF 没有新控件或新主题,重点在内部优化与长期问题的修复。
| 方向 | 内容 |
|---|---|
| 性能优化 | 尽量避免装箱 / 拆箱、减少堆分配、复用 StringBuilder 实例(不需要时就不创建) |
| 无障碍与键盘交互 | DataGrid / GridView 列宽可用 Alt + ←/→ 调整;启用排序后按 F3 可排序;可勾选菜单项现在能被屏幕阅读器正确朗读 |
| 社区 bug 修复 | FocusVisualStyle 无法全局覆盖、CommandParameter 未使 CanExecute 失效、ContextMenu 在宿主移出视觉树后失效、ComboBoxItem 提示、字形序列化舍入误差等(多来自社区 PR) |
3.2 .NET 8 · 硬件加速 + 新对话框
官方原文只有两件事:RDP 硬件加速与新的文件夹选择对话框。
RDP 硬件加速
此前所有**远程桌面(RDP)**下运行的 WPF 应用只能软件渲染,即使系统有 GPU。.NET 8 允许显式启用硬件加速——在 runtimeconfig.json 中设置:
{
"configProperties": {
"Switch.System.Windows.Media.EnableHardwareAccelerationInRdp": true
}
}
OpenFolderDialog
新增 Microsoft.Win32.OpenFolderDialog,让用户浏览并选择文件夹——以前这功能得靠第三方库或 WinForms 混用。
var openFolderDialog = new OpenFolderDialog()
{
Title = "Select folder to open ...",
InitialDirectory = Environment.GetFolderPath(
Environment.SpecialFolder.ProgramFiles)
};
string folderName = "";
if (openFolderDialog.ShowDialog())
{
folderName = openFolderDialog.FolderName;
}
3.3 .NET 9 · 视觉系统大更新
本年度 WPF 的焦点是提升视觉能力,引入基于 Windows 11 Fluent 设计原则的全新主题——这是 WPF 近五年最大的一次外观升级。下面的截图来自官方的 WPF Gallery 示例应用(可从 Microsoft Store 直接安装体验)。
图 3 / 图 4:同一套 WPF Gallery 界面在 Fluent 明色与暗色模式下的渲染结果(来源:Microsoft Learn 官方文档)。
四块内容:
| 能力 | 说明 |
|---|---|
| Fluent 主题 | 全新的 Windows 11 现代观感,内置明暗模式 + 系统强调色支持。资源字典:PresentationFramework.Fluent;component/Themes/Fluent.xaml |
ThemeMode 属性 | 值:Light / Dark / System / None(默认 Aero2)。可在 Application 或 Window 级别设置。代码中访问为实验性(触发 WPF0001) |
| Windows 强调色 | 通过 System.Windows.SystemColors 获取用户强调色(AccentColor)及 3 档明暗变体(AccentColorLight1-3 / Dark1-3),可作 Color / SolidColorBrush / ResourceKey,配 DynamicResource 自动跟随 |
| 连字符连字 | 补齐社区多年需求:TextBlock 等 UI 控件首次支持基于连字符的连字(ligature)渲染 |
连字这项改变,肉眼看下面两张对比图最直接——同样是 <- -> 这对箭头,.NET 8 是两个独立字形,.NET 9 合成一个连字:
图 5 / 图 6:连字符连字在 .NET 8 与 .NET 9 中的渲染差异(来源:Microsoft Learn 官方文档)。
破坏性变更
BinaryFormatter自 .NET 9 起被移除,调用即抛PlatformNotSupportedException。WPF 的剪贴板与拖放操作曾依赖它,现内部改用已知类型的更安全子集;官方提供专门的迁移指南。
3.4 .NET 10 · 打磨与完善
延续 .NET 9 路线,重点是性能、Fluent 补全、API 增强与大规模代码清理。
| 方向 | 内容 |
|---|---|
| 性能优化 | 内部数据结构替换为 ReadOnlyCollection<T> 等基础类型,减少 UI 自动化与文件对话框分配、加快像素格式转换;字体集合加载器迁移到托管代码;字体渲染、动态资源、输入合成、正则、XAML 解析全面提速 |
| Fluent 控件补全 | 新增 9 个控件:DatePicker、GridSplitter、GridView、GroupBox、Hyperlink、Label、NavigationWindow、RichTextBox、TextBox;修复 Expander 动画、高对比度崩溃、RTL 布局(MenuItem / Expander / TreeViewItem) |
MessageBox 新枚举 | MessageBoxButton 新增 AbortRetryIgnore / RetryCancel / CancelTryContinue;MessageBoxResult 新增 Abort / Retry / Ignore / TryAgain / Continue |
Grid 字符串简写 | 行列定义支持一行式写法,告别冗长的 <Grid.ColumnDefinitions> 块 |
| 剪贴板统一 | WPF 与 Windows Forms 现在使用同一套剪贴板 API;旧方法标记过时,新增 JSON 序列化方法替代 BinaryFormatter |
| 代码清理 | 移除遗留的 Code Access Security(CAS)代码与资源;淘汰 ArrayList 等旧构造;为 System.Xaml / WindowsBase 补充 4000+ 单元测试 |
Grid 简写是日常写 XAML 最直接受益的一个:
<!-- 以前:逐行 <ColumnDefinition /> 与 <RowDefinition /> -->
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="2*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
</Grid>
<!-- .NET 10:一行搞定 -->
<Grid ColumnDefinitions="1*, 2*, Auto, *, 300"
RowDefinitions="1*, Auto, 25, 14, 20" />
MessageBox 的枚举扩展来自社区贡献者 bstordrup(dotnet/wpf#9613),Grid 简写来自 dotMorten(dotnet/wpf#1739)——这两项都是典型的"官方没做、社区顶上"。
WPF 现状 Fluent 样式支持仍在推进中(官方原文 "still in progress"),尚未覆盖全部控件。若追求开箱即用的现代 UI,第三方库(WPF-UI、HandyControl、MaterialDesignInXaml)仍是成熟选择。
4. C# 语言特性地图(11 → 14)
只列对日常开发有意义、且与 WPF / 桌面场景相关的特性。
| 特性 | 版本 | 用途 |
|---|---|---|
原始字符串字面量 """ | C# 11 | 多行字符串免转义,写 XAML / SQL / JSON 样板极方便 |
required 成员 | C# 11 | 编译期强制初始化,替代构造函数校验 |
列表模式 is [var first, .., var last] | C# 11 | 简洁的序列解构与匹配 |
| 泛型数学 | C# 11 | 静态抽象接口成员,数值算法复用 |
| 主构造函数(全类型) | C# 12 | 类 / 结构体构造参数直接可用,大幅减样板 |
集合表达式 [a, ..b] | C# 12 | 统一初始化语法,支持展开 |
ref readonly 参数 | C# 12 | 大结构体只读传引用的性能优化 |
内联数组 [InlineArray] | C# 12 | 高性能固定长度缓冲区 |
params 集合 | C# 13 | params 可用于 Span / IEnumerable 等,不限数组 |
System.Threading.Lock | C# 13 | 专用锁类型,lock 更安全高效 |
| 部分属性 / 索引器 | C# 13 | 配合源生成器拆分布局 |
field 关键字 ★ | C# 14 | 直接访问编译器合成的幕后字段,终结手写 _backing |
| 扩展块(扩展属性 / 静态成员) ★ | C# 14 | 扩展方法升级为可加属性、运算符、静态成员 |
空条件赋值 x?.P = v | C# 14 | 仅当对象非 null 时赋值 |
nameof(List<>) | C# 14 | 非绑定泛型也可取名字 |
| 隐式 Span 转换 | C# 14 | 数组 / 字符串更自然地转 Span,方法边界更干净 |
文件级应用 dotnet run app.cs | C# 14 | 单文件即程序,无需 .csproj(含 #:package 指令) |
5. 代码示例(C# 14 与 WPF 亮点)
5.1 field 关键字:终结幕后字段样板
// C# 13 及以前:需要手写私有幕后字段
private string _name = "";
public string Name
{
get => _name;
set => _name = value ?? throw new ArgumentNullException(nameof(value));
}
// C# 14:field 直接指向编译器合成的幕后字段
public string Name
{
get;
set => field = value ?? throw new ArgumentNullException(nameof(value));
}
// 懒初始化也读起来很顺
public object Heavy => field ??= Compute();
注意
field现在在属性访问器内是上下文关键字。若类中真有名叫field的成员,需要用@field引用,编译器会给出警告。
5.2 扩展块:不只方法,还能加属性与静态成员
public static class EnumerableExtensions
{
extension<IEnumerable<int>>(IEnumerable<int> source)
{
// 扩展属性:调用处不带括号
public bool IsEmpty => !source.Any();
// 普通扩展方法(新语法)
public IEnumerable<int> WherePositive() => source.Where(x => x > 0);
}
extension(string)
{
// 静态扩展成员:以 string.JoinLines(...) 调用
public static string JoinLines(IEnumerable<string> lines)
=> string.Join('\n', lines);
}
}
// 使用
var nums = new List<int>();
if (nums.IsEmpty) { /* ... */ } // 属性式调用
兼容性 旧的
this参数写法仍然有效且未废弃。当需要属性 / 静态成员,或一次给某类型加多个成员时,才用块形式。
5.3 文件级应用:单文件即程序
#:package Humanizer@2.14.1
using Humanizer;
Console.WriteLine(DateTime.Now.AddDays(-3).Humanize());
dotnet run hello.cs # 直接运行单文件
dotnet project convert hello.cs # 长大后转成正式项目
意义与边界 以前写小工具默认开 Python / PowerShell,现在 C# 也能胜任。但注意:WPF 桌面应用不适用此模式,仍需正式项目文件。
5.4 WPF:启用 Fluent 主题(.NET 9+)
方式一:ThemeMode 属性(推荐)
<Application x:Class="MyWpfProject.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml"
ThemeMode="System"> <!-- Light / Dark / System / None -->
</Application>
方式二:直接合并资源字典
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary
Source="pack://application:,,,/PresentationFramework.Fluent;component/Themes/Fluent.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
使用系统强调色
<TextBlock Text="First Name:"
Foreground="{DynamicResource {x:Static SystemColors.AccentColorBrushKey}}" />
实验性 API 在代码中访问
ThemeMode会产生WPF0001错误(实验性)。需在项目文件加<NoWarn>$(NoWarn);WPF0001</NoWarn>,或在本地用#pragma warning disable WPF0001。 另有一条容易踩的规则:应用级设了非None的值之后,窗口级就不能再设回None。
6. 关键破坏性变更
| 变更 | 起始版本 | 影响与应对 |
|---|---|---|
BinaryFormatter 移除 | .NET 9 | 调用即抛 PlatformNotSupportedException。影响剪贴板 / 拖放等序列化场景,改用 JSON 或安全子集 |
| 剪贴板 API 过时标记 | .NET 10 | 部分旧剪贴板方法被标记过时,新增 JSON 序列化方法替代 |
| Blazor WASM 流式读取默认开启 | .NET 10 | 同步 Stream.Read 会失败,需改异步读取或显式关闭 |
| CAS 相关代码清理 | .NET 10 | 从 .NET Framework 迁移遗留的 Code Access Security 特性被移除(一般不影响业务代码) |
7. 升级路线建议(2026)
| 你的现状 | 建议目标 | 理由 |
|---|---|---|
| 新生产项目 | .NET 10 LTS | 支持到 2028.11,减少迁移折腾,最稳的长期赌注 |
| .NET 8 LTS,运行稳定 | 继续 8,择机升 10 | 8 与 10 均在支持期内,可等业务窗口再动 |
| .NET 9 STS | 尽快升 .NET 10 | STS 支持 2026.11 截止,不宜作为长期落脚点 |
| .NET 5 / 6 / 7 | 立即升级 | 均已终止支持,存在安全与合规风险 |
| 停留在 .NET Framework 4.8 | 评估迁移 | 随 Windows 生命周期支持,但无法使用现代 C# 与跨平台能力 |
判断路径可以压缩成三条分支:
┌─ 已终止支持(5/6/7)────────► 立即升级,无谈判空间
当前版本 ────────┼─ STS(9,2026.11 到期)─────► 升 .NET 10 LTS
└─ LTS(8,2026.11 到期)─────► 可等到 2026 Q4 再动
└► 但新项目一律直接 10
一句话 2026 年的默认答案:新项目上 .NET 10(LTS);老项目先看支持状态,已终止支持的版本必须优先迁出。 时间点提醒:.NET 8 与 .NET 9 的支持都会在 2026 年 11 月同时结束——现在就是最后一个迁移窗口。
8. 速查总表
| 版本 | 发布 | 类型 | C# | 支持截止 | 标志性内容 |
|---|---|---|---|---|---|
| .NET 6 | 2021.11 | LTS | C# 10 | 2024.11 ❌ | 统一平台、Minimal API、Hot Reload |
| .NET 7 | 2022.11 | STS | C# 11 | 2024.05 ❌ | 原始字符串、required、泛型数学 | WPF:性能 + 无障碍 + bug 修复 |
| .NET 8 | 2023.11 | LTS | C# 12 | 2026.11 | 主构造函数、集合表达式、Native AOT 成熟 | WPF:RDP 硬件加速 + OpenFolderDialog |
| .NET 9 | 2024.11 | STS | C# 13 | 2026.11 | params 集合、Lock | WPF:Fluent 主题 + ThemeMode + 强调色 |
| .NET 10 | 2025.11 | LTS | C# 14 | 2028.11 | field 关键字、扩展块、文件级应用 | WPF:Fluent 补全 + Grid 简写 + MessageBox 枚举 |
| .NET 11 | 2026.11 | STS | C# 15 | 预览 | 早期采用者与库作者 |