總有小夥伴問: “winform 和 wpf 有什麼區別?”
細想這個問題好像很簡單回答,但是總是沒有系統的分析過,今天抽空特地寫一篇僅代表個人觀點的文章記錄總結。

WinForms
顧名思義,基本上是一種引入 .net 框架的基於 gui 的方法。在 wpf 和 silverlight 之前,它是用於構建 gui 的 .net 的主要 api。除了運行時和作業系統之外,它不需要任何類型的支持來開發獨立的應用程式。可以開發易於部署、更新、管理和離線工作的應用程式,同時連接到 internet。winforms 的開發非常簡單,因為它只是基於 ui 控制項在畫布上的拖放放置。它是開發桌面應用程式的舊平台。
WPF(Windows Presentation Foundation)
wpf,顧名思義,是用於開發 windows 或桌面客戶端應用程式的 ui 框架。它是與 .net 框架一起使用的 gui 框架的最新方法。引入它是為了開發在 windows 作業系統上運行的 windows 客戶端應用程式,以及下一代 windows 窗體。它具有開發、運行、執行、管理和處理 windows 客戶端應用程式所需的所有功能。
上手難度不同
windowform 的難度比 wpf 相對低,因為 wpf 你要學習 xaml 的語法,還要學習 mvvm,而 winform 大多數只需要拖拉拽控制項即可快速上手一個項目.
渲染機制不同
winform gdi+繪製,wpf directx 渲染繪製
GDI + :编写图形程序时需要使用 GDI(GraphicsDeviceInterface,图形设备接口),从程序设计的角度看,GDI 包括两部分:一部分是 GDI 对象,另一部分是 GDI 函数。GDI 对象定义了 GDI 函数使用的工具和环境变量,而 GDI 函数使用 GDI 对象绘制各种图形,在 C#中,进行图形程序编写时用到的是 GDI+(GraphiceDeviceInterfacePlus 图形设备接口)版本,GDI+是 GDI 的进一步扩展,它使我们编程更加方便。
简单理解就是2D绘图
DirectX(Direct eXtension,缩写:DX)是由微软公司创建的一系列专为多媒体以及游戏开发的应用程序接口。旗下包含 Direct3D、Direct2D、DirectCompute 等等多个不同用途的子部分,因为这一系列 API 皆以 Direct 字样开头,所以 DirectX(只要把 X 字母替换为任何一个特定 API 的名字)就成为这一巨大的 API 系列的统称。
简单理解就是既能2D,也能3D绘图
简单理解,WPF理论上可以写更牛X的界面。渲染速度更快,复杂度更高
核心機制不同
winform 事件驅動,wpf 數據驅動
数据驱动:数据第一,控件第二。数据的变化带动 UI,
便于前后端解耦。
事件驱动:通过事件绑定方式,实现控件各项事件的触发来调用业务层逻辑使程序有序运行,
极容易造成前后端高耦合。
控制項存在形式
在 windows gdi 或 winform 開發中複雜的 gui 應用程式,會使用的大量的控制項,如 grid 等。而每個控制項或 grid cell 都是一個小窗口,會使用一個 window handle,儘管控制項廠商提供了很多優化辦法,但還是會碰到 out of memory 或"error create window handle",而導致程式退出。
wpf 徹底改變了控制項顯示的模式,控制項不再使用窗口,也就不會占用 window handle。理論上,如果一個 wpf 只有一個主窗口的話,wpf 只會使用一個 window handle(如果忽略用於 dispatcher 的隱藏窗口的話)。所以 wpf gui 程式不會出現 window handle 不夠用的情況。
WinForm VS WPF
| 區別點 | WinForms | WPF |
|---|---|---|
| 渲染方式 | GDI+ | DirectX |
| 渲染速度 | 慢 | 快 |
| 上手難度 | 普通 | 較為困難 |
| 驅動機制 | 事件驅動 | 數據驅動 |
| 前後端是否分離 | 不易分離 | 較易分離 |
| 自適應 | 較為困難 | 容易 |
| 提供矢量 2d 和 3d 功能 | 否 | 是 |
| 需要內存 | 少 | 多 |
| 支持界面虛擬化,方便處理大型數據集。 | 不支持 | 支持 |
| 控制項以窗口形式存在 | 是 | 否 |