C#-WPF-MVVM未来主流

0 阅读13分钟

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 月


目录

  1. 一页速览
  2. 版本节奏与支持策略
  3. 时间轴 2022 → 2026
  4. WPF 逐版本演进(.NET 7 → 10)
  5. C# 语言特性地图(11 → 14)
  6. 代码示例(C# 14 与 WPF 亮点)
  7. 关键破坏性变更
  8. 升级路线建议(2026)
  9. 速查总表
  10. 图片与引文出处

一页速览

微软把 .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 RuntimeBCL API 是否存在、JIT / GC 行为
语言 C# 14C# 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 72022.11STSC# 112024.05 ❌原始字符串、required、泛型数学
.NET 82023.11LTSC# 122026.11主构造函数、集合表达式、RDP 硬件加速
.NET 92024.11STSC# 132026.11params 集合、Lock、Fluent 主题
.NET 102025.11LTSC# 142028.11field、扩展块、文件级应用
.NET 112026.11STSC# 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# 13params 可用于 Span / IEnumerable 等,不限数组
System.Threading.LockC# 13专用锁类型,lock 更安全高效
部分属性 / 索引器C# 13配合源生成器拆分布局
field 关键字 ★C# 14直接访问编译器合成的幕后字段,终结手写 _backing
扩展块(扩展属性 / 静态成员) ★C# 14扩展方法升级为可加属性、运算符、静态成员
空条件赋值 x?.P = vC# 14仅当对象非 null 时赋值
nameof(List<>)C# 14非绑定泛型也可取名字
隐式 Span 转换C# 14数组 / 字符串更自然地转 Span,方法边界更干净
文件级应用 dotnet run app.csC# 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,择机升 108 与 10 均在支持期内,可等业务窗口再动
.NET 9 STS尽快升 .NET 10STS 支持 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 62021.11LTSC# 102024.11 ❌统一平台、Minimal API、Hot Reload
.NET 72022.11STSC# 112024.05 ❌原始字符串、required、泛型数学 | WPF:性能 + 无障碍 + bug 修复
.NET 82023.11LTSC# 122026.11主构造函数、集合表达式、Native AOT 成熟 | WPF:RDP 硬件加速 + OpenFolderDialog
.NET 92024.11STSC# 132026.11params 集合、Lock | WPF:Fluent 主题 + ThemeMode + 强调色
.NET 102025.11LTSC# 142028.11field 关键字、扩展块、文件级应用 | WPF:Fluent 补全 + Grid 简写 + MessageBox 枚举
.NET 112026.11STSC# 15预览早期采用者与库作者