Winform和WPF有什麼區別?

Winform和WPF有什麼區別?

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

最後更新 2022/4/7 下午7:56
DotNetOneByOne
預計閱讀 4 分鐘
分類
WPF Winform
標籤
.NET WPF Winform

總有小夥伴問:「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 用戶端應用程式所需的所有功能。

上手難度不同

Window Forms 的難度比 WPF 相對低,因為 WPF 你要學習 XAML 的語法,還要學習 MVVM,而 WinForm 大多數只需要拖拉拽控制項即可快速上手一個專案。

渲染機制不同

WinForm GDI+ 繪製,WPF DirectX 渲染繪製

GDI+:編寫圖形程式時需要使用 GDI(Graphics Device Interface,圖形設備介面),從程式設計的角度看,GDI 包括兩部分:一部分是 GDI 物件,另一部分是 GDI 函數。GDI 物件定義了 GDI 函數使用的工具和環境變數,而 GDI 函數使用 GDI 物件繪製各種圖形,在 C# 中,進行圖形程式編寫時用到的是 GDI+(Graphics Device Interface Plus 圖形設備介面)版本,GDI+ 是 GDI 的進一步擴展,它使我們程式設計更加方便。簡單理解就是 2D 繪圖

DirectX(Direct eXtension,縮寫:DX)是由微軟公司建立的一系列專為多媒體以及遊戲開發的應用程式介面。旗下包含 Direct3D、Direct2D、DirectCompute 等等多個不同用途的子部分,因為這一系列 API 皆以 Direct 字樣開頭,所以 DirectX(只要把 X 字母替換為任何一個特定 API 的名字)就成為這一巨大的 API 系列的統稱。簡單理解就是既能 2D,也能 3D 繪圖

簡單理解,WPF 理論上可以寫更厲害的介面。渲染速度更快,複雜度更高

核心機制不同

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 功能
需要記憶體
支援介面虛擬化,方便處理大型資料集。 不支援 支援
控制項以視窗形式存在
繼續探索

延伸閱讀

更多文章