写在前面
版本说明:.NET 8 LTS + Visual Studio 2022,代码在 Windows 10/11 验证。
这个系列和「WPF 学习笔记」12 篇是兄弟篇——两者都是 .NET 桌面 UI 框架,但走了两条截然不同的路:
- WinForms(2002,Framework 1.0):封装 Win32 API,控件是 HWND 的包装,GDI+ 绘制。简单、稳定、设计器好用。
- WPF(2006,Framework 3.0):全新设计,XAML + DirectX + 依赖属性 + 数据绑定 + MVVM。强大、现代,但复杂。
为什么 2026 年还学 WinForms?因为它没死:企业内部工具、工业软件、金融终端、快速原型,WinForms 仍是主力——简单、开发快、运行稳、机器老也能跑。很多公司有几十年积累的 WinForms 代码要维护。而且理解 WinForms 的"Win32 思维",反过来更能理解 WPF 为什么那样设计。
本系列 8 篇,定位和 WPF 系列一致:全景式(基础 + 原理 + 实战),面向 .NET 后端转桌面的读者。读完你能:上手 WinForms 开发、理解它和 WPF 的本质差异、知道什么时候该选哪个。
一、WinForms 是什么:Win32 的托管包装
WinForms 的本质一句话:把 Win32 的窗口(HWND)和 GDI+ 绘图,包装成 .NET 托管对象。
| |
所以 WinForms 的每个控件都是真实的操作系统窗口(有 HWND),这和 WPF 截然不同(WPF 一个窗口通常只有一个 HWND,内部全自绘)。
| |
这就是 WinForms 的"味道":直接、命令式、像写脚本。设置属性、挂事件、加到 Controls,完事。没有 XAML、没有绑定、没有标记扩展。
二、WinForms vs WPF:两条路的核心差异
这是本系列最重要的对照(也是第 8 篇的主题):
| 维度 | WinForms | WPF |
|---|---|---|
| 渲染 | GDI+(立即模式近亲,每个控件自绘到自己的 HWND) | DirectX(保留模式,整棵视觉树提交 GPU) |
| 窗口模型 | 每控件一个 HWND | 一窗口一 HWND,内部自绘 |
| UI 描述 | C# 代码 + 设计器(.Designer.cs) | XAML(声明式标记) |
| 属性系统 | 普通 CLR 属性 | 依赖属性(支持绑定/动画/样式) |
| 事件 | 老式 event(无路由) | 路由事件(视觉树冒泡/隧道) |
| 数据绑定 | 弱(BindingSource,主要表单/表格场景) | 强(双向/Converter/CollectionView,任意属性) |
| 自定义外观 | GDI+ 自绘 / 继承控件 | ControlTemplate(彻底换皮) |
| 架构模式 | 习惯 code-behind 直写 | MVVM(原生支持) |
| 学习曲线 | 平缓(拖控件 + 写事件) | 陡(XAML + 绑定 + 模板) |
| 现代化 | .NET 8 支持,但 API 老旧 | .NET 8 支持,持续优化 |
| |
如果你是后端,WinForms 上手更快(像写控制台程序,拖控件挂事件);WPF 更"工程化"(MVVM、绑定、可测试),但入门门槛高。
三、WinForms 的现代定位(谁还在用)
2026 年,WinForms 不是主流新技术,但远没死:
| |
.NET 8/9 下 WinForms 是开源的(dotnet/winforms),仍持续修 bug、支持新 .NET。支持单文件发布、ReadyToRun、ClickOnce 部署。生命周期随 .NET LTS。
四、开发环境与项目结构
- Visual Studio 2022(推荐):设计器体验最好,拖控件、属性面板、事件挂接一站式。
- VS Code + dotnet CLI:能写代码,但没有可视化设计器(WinForms 设计器依赖 VS)。
- 项目模板:
dotnet new winforms(SDK 风格,.NET 8)。
| |
生成的项目结构:
| |
Form1.cs 和 Form1.Designer.cs 是同一个类的两半(partial),设计器管布局、你管逻辑——这是 WinForms 的核心代码组织方式,第 2 篇详讲。
五、本系列怎么跟
8 篇,全景式:
| |
每篇有可跑的代码示例,聚焦"为什么这样设计"而不只是 API 罗列。线程篇(6)会交叉链到本站「.NET 高并发编程」的 async 死锁节——WinForms 的 WindowsFormsSynchronizationContext 正是死锁三宿主之一。
六、小结
| |
下一篇:Form 与控件体系——设计器怎么生成代码、控件树怎么组织、.Designer.cs 和 .resx 里装了什么。