写在前面
系列收官篇。前面 7 篇学了 WinForms 本身,本篇把它和兄弟框架 WPF 摆一起,做全维度对照、选型决策、迁移路径。
两个框架是"两条路"不是"新旧迭代"。读完这篇你知道什么项目选哪个,以及现有代码要不要迁。
一、本质差异回顾
| |
两者都还活着(.NET 8 支持),不是迭代关系,是两条并行的路。理解这点,选型才不纠结。
二、全维度对照
| 维度 | WinForms | WPF | 谁赢 |
|---|---|---|---|
| 渲染 | GDI+(CPU,无硬件加速) | DirectX(GPU,矢量) | WPF |
| 窗口模型 | 每控件一个 HWND | 一窗一 HWND,内部自绘 | WPF(缩放/动画好) |
| UI 描述 | C# 代码 + 设计器 | XAML(声明式) | 看团队 |
| 属性系统 | 普通 CLR 属性 | 依赖属性(绑定/动画/样式) | WPF |
| 事件 | 老式 event | 路由事件(冒泡/隧道) | WPF |
| 数据绑定 | 弱(BindingSource/DataGridView) | 强(任意属性/Converter/集合视图) | WPF |
| 自定义外观 | GDI+ 自绘 / 继承 | ControlTemplate(彻底换皮) | WPF |
| 动画 | 手写 OnPaint + Timer | Storyboard 声明式 | WPF |
| MVVM | 可用但不顺 | 原生支持(社区惯例) | WPF |
| 设计器 | VS 拖拽,最强 | VS 设计器,可以但不如 WinForms | WinForms |
| 上手速度 | 快(拖控件挂事件) | 慢(XAML + 绑定 + 模板) | WinForms |
| 学习曲线 | 平缓 | 陡 | WinForms |
| 老代码维护 | 海量遗留 | 中等量 | 平 |
| 现代 UI 视觉 | 难(土) | 能(模板/动画/现代控件库) | WPF |
一句话:要现代/复杂 UI/数据驱动 → WPF;要快/简单/老代码 → WinForms。
三、各自的主场
| |
四、选型决策表
| |
没有绝对赢家,看项目周期、团队、UI 复杂度、维护预期。
五、迁移路径
WinForms → WPF
不建议盲目迁。迁移成本高(整套 UI 重写 + XAML + 绑定)。只有这些情况值得迁:
- UI 要大幅现代化(原 WinForms 已撑不住视觉需求)
- 要 MVVM 化提升可测试性 / 团队规模扩大
- 跨平台考虑(后续可走 MAUI,WPF 和 MAUI 共享 XAML 思路)
迁移要点:
- 业务逻辑(Model/Service)基本可复用(纯 C#)。
- UI 层全部重写(Form → Window,事件 → 命令,DataGridView → DataGrid)。
- 渐进式:WPF 窗口可 hosted 在 WinForms 里(ElementHost)或反过来(WindowsFormsHost),混合过渡。
WPF → WinForms
极少见。除非:接手的项目 WPF 用得很糟(全 code-behind、没绑定),不如退回 WinForms 简化。一般不迁。
共存
WindowsFormsHost(WPF 里嵌 WinForms 控件)和 ElementHost(WinForms 里嵌 WPF 控件)让两者能混合——迁移过渡期或"核心 WPF + 个别老 WinForms 控件"复用。
六、还要不要学桌面?现代选项
2026 年,纯桌面新项目少(很多上 Web/Electron)。但 .NET 桌面仍有市场:
| |
但别焦虑:WinForms/WPF 在企业/工业/金融仍是主力,几十年不会消失。学会这两个,加上理解了"Win32 思维 vs 现代图形思维",迁移到 MAUI/WinUI 思路一致(都是 XAML + 绑定系)。
七、系列收官
| |
| |
和「WPF 学习笔记」12 篇配起来,.NET 桌面两大框架就齐了——选哪个、为什么、怎么迁移,你心里有数。再往新走,MAUI/WinUI 的 XAML 思路一脉相承。