WinForms 学习笔记(八):WinForms vs WPF——选型与迁移

写在前面

系列收官篇。前面 7 篇学了 WinForms 本身,本篇把它和兄弟框架 WPF 摆一起,做全维度对照、选型决策、迁移路径。

两个框架是"两条路"不是"新旧迭代"。读完这篇你知道什么项目选哪个,以及现有代码要不要迁。


一、本质差异回顾

1
2
3
4
5
6
7
WinForms(2002):
  Win32 思维 —— 控件 = HWND,GDI+ 绘制,命令式代码 + 设计器
  "简单、稳定、土"

WPF(2006):
  现代图形思维 —— DirectX 保留模式,XAML 声明式,数据驱动
  "强大、现代、陡"

两者都还活着(.NET 8 支持),不是迭代关系,是两条并行的路。理解这点,选型才不纠结。


二、全维度对照

维度WinFormsWPF谁赢
渲染GDI+(CPU,无硬件加速)DirectX(GPU,矢量)WPF
窗口模型每控件一个 HWND一窗一 HWND,内部自绘WPF(缩放/动画好)
UI 描述C# 代码 + 设计器XAML(声明式)看团队
属性系统普通 CLR 属性依赖属性(绑定/动画/样式)WPF
事件老式 event路由事件(冒泡/隧道)WPF
数据绑定弱(BindingSource/DataGridView)强(任意属性/Converter/集合视图)WPF
自定义外观GDI+ 自绘 / 继承ControlTemplate(彻底换皮)WPF
动画手写 OnPaint + TimerStoryboard 声明式WPF
MVVM可用但不顺原生支持(社区惯例)WPF
设计器VS 拖拽,最强VS 设计器,可以但不如 WinFormsWinForms
上手速度快(拖控件挂事件)慢(XAML + 绑定 + 模板)WinForms
学习曲线平缓WinForms
老代码维护海量遗留中等量
现代 UI 视觉难(土)能(模板/动画/现代控件库)WPF

一句话:要现代/复杂 UI/数据驱动 → WPF;要快/简单/老代码 → WinForms


三、各自的主场

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
选 WinForms 的场景:
  ✓ 企业内部工具(ERP/CRM 客户端、数据录入)
  ✓ 工业软件(设备控制、监控面板)
  ✓ 金融终端(行情/交易)
  ✓ 快速原型 / 内部小工具
  ✓ 维护海量遗留代码
  ✓ 团队没 XAML/MVVM 经验,要快速出活

选 WPF 的场景:
  ✓ 需要复杂自定义 UI / 动画 / 现代视觉
  ✓ 数据驱动重(大量绑定、表单、图表)
  ✓ 想用 MVVM 做可测试的工程化架构
  ✓ 需要 DPI 缩放/触控更好的体验
  ✓ 新项目、能接受学习曲线

四、选型决策表

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
你的情况                             选
─────────────────────────────────────────────────────
维护老 WinForms 项目                 WinForms(别为重构而重构)
快速做个内部小工具(一两天上线)      WinForms(拖拽就完事)
复杂自定义 UI / 动画 / 现代 Material  WPF
数据密集(大量表单/表格/图表)        WPF(绑定强)或 WinForms(DataGridView 够用)
团队熟悉 .NET 但没桌面经验           WinForms 上手快
要 MVVM / 单元测试 ViewModel          WPF
要触控 / 高 DPI 精致                  WPF
要进 Microsoft Store                  都行(MSIX 打包)
跨平台桌面                            都不行 → 看 MAUI / Avalonia

没有绝对赢家,看项目周期、团队、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 桌面仍有市场:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
.NET 桌面技术谱系:
  WinForms    老、简单、维护多(本系列)
  WPF         现代 XAML、强(姊妹系列 12 篇)
  UWP         退场中(被 WinUI 取代)
  WinUI 3     Windows App SDK,UWP 的继任(现代 Fluent)
  MAUI        跨平台(Win/Mac/iOS/Android),XAML
  Avalonia    第三方跨平台 XAML(类 WPF,社区活跃)

  选型:
    只 Windows + 现代 UI         → WinUI 3 / WPF
    跨平台桌面                   → MAUI / Avalonia
    老项目维护 / 快速工具         → WinForms / WPF

别焦虑:WinForms/WPF 在企业/工业/金融仍是主力,几十年不会消失。学会这两个,加上理解了"Win32 思维 vs 现代图形思维",迁移到 MAUI/WinUI 思路一致(都是 XAML + 绑定系)。


七、系列收官

1
2
3
4
5
6
7
8
9
WinForms 学习笔记 8 篇走完:
  1. WinForms 是什么(Win32 包装、vs WPF)
  2. Form 与控件体系(设计器、partial、控件树)
  3. 事件模型(event、订阅退订、内存泄漏)
  4. GDI+ 绘制(Graphics、OnPaint、双缓冲、自定义控件)
  5. 数据绑定(BindingSource、DataGridView、INPC)
  6. 线程与 async(UI 线程、Invoke、死锁)
  7. 部署(ClickOnce、单文件、签名)
  8. WinForms vs WPF(本篇,选型迁移)
1
2
3
4
5
6
核心收获:
  ✓ WinForms = Win32 包装 + 命令式代码 + 设计器,简单稳
  ✓ 理解 partial class / 控件树 / GDI+ Dispose / 事件退订
  ✓ 单 UI 线程 + Invoke/async + 死锁禁忌(呼应高并发篇)
  ✓ 数据绑定够用(BindingSource/DataGridView)
  ✓ 选型看场景:现代 UI → WPF;快/老项目 → WinForms

和「WPF 学习笔记」12 篇配起来,.NET 桌面两大框架就齐了——选哪个、为什么、怎么迁移,你心里有数。再往新走,MAUI/WinUI 的 XAML 思路一脉相承。