いつも仲間から「WinFormとWPFの違いは何ですか?」と聞かれます。
考えてみると、この質問は簡単そうに見えますが、体系的に分析したことはありませんでした。今日は時間を取って、個人的な見解をまとめた記事を書いて記録します。

WinForms
名前の通り、基本的には.NETフレームワークに導入されたGUIベースの手法です。WPFやSilverlight以前は、GUI構築のための.NETの主要APIでした。ランタイムとOS以外に、スタンドアロンアプリケーションを開発するための特別なサポートは必要ありません。インターネットに接続しながら、簡単にデプロイ、更新、管理でき、オフラインでも動作するアプリケーションを開発できます。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(Graphics Device Interface、グラフィックデバイスインターフェース)を使用する必要があります。プログラム設計の観点から見ると、GDIは2つの部分で構成されています。1つはGDIオブジェクト、もう1つは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は理論的にはより素晴らしいUIを書くことができます。レンダリング速度が速く、複雑さも高い
コアメカニズムの違い
Winform: イベント駆動、WPF: データ駆動
データ駆動:データが第一、コントロールは第二。データの変化がUIを動かす。
フロントエンドとバックエンドの分離が容易になる。
イベント駆動:イベントバインディング方式により、コントロールの各イベントのトリガーを介してビジネスロジック層を呼び出し、プログラムを順序立てて実行する。
フロントエンドとバックエンドの高い結合を引き起こしやすい。
コントロールの存在形態
Windows GDIやWinForm開発で複雑なGUIアプリケーションを作成する場合、Gridなど多数のコントロールが使用されます。各コントロールやGridセルは小さなウィンドウであり、Windowハンドルを使用します。コントロールベンダーは多くの最適化手法を提供していますが、それでもOut of Memoryや「Error Create Window handle」が発生し、プログラムが終了することがあります。
WPFはコントロールの表示モードを完全に変更し、コントロールはウィンドウを使用せず、Windowハンドルを占有しません。理論的には、WPFにメインウィンドウが1つしかない場合、WPFは1つのWindowハンドルだけを使用します(Dispatcher用の非表示ウィンドウを無視した場合)。そのため、WPF GUIプログラムではWindowハンドル不足の問題は発生しません。
WinForm VS WPF
| 相違点 | WinForms | WPF |
|---|---|---|
| レンダリング方式 | GDI+ | DirectX |
| レンダリング速度 | 遅い | 速い |
| 習得難易度 | 普通 | やや難しい |
| 駆動メカニズム | イベント駆動 | データ駆動 |
| フロントエンドとバックエンドの分離 | 分離しにくい | 分離しやすい |
| アダプティブ | やや難しい | 容易 |
| ベクター2Dおよび3D機能の提供 | なし | あり |
| 必要なメモリ | 少ない | 多い |
| UI仮想化対応、大規模データセット処理 | 非対応 | 対応 |
| コントロールがウィンドウ形式で存在 | はい | いいえ |