Technically Impossible

Lets look at the weak link in your statement. Anything "Technically Impossible" basically means we haven't figured out how yet.

何が同じで、何が違うのか? - Windowsフォームアプリケーション、Windowsフォームアプリ、そしてWPFアプリケーション

f:id:espio999:20211207230232p:plain
Visual Studioで新規プロジェクトを作成するとき、特にWindowsデスクトップのプロジェクトには3つの選択肢がある。冒頭の画像が、その選択画面だ。必要な情報だけを抽出すると、つぎのようになる。

Windowsフォームアプリケーション (.NET Framework) Windows Forms (WinForms)ユーザーインターフェイスを含むアプリケーション
Windowsフォームアプリ .NET Windowsフォーム(WinForms)アプリ
WPFアプリケーション .NET WPFアプリケーション

一体どれだけのユーザーが、これを区別、理解できるだろう。また翻訳担当者、責任者は、この表現によって、翻訳が意図していること、事実を共通認識としてユーザーに持たせることができると確信していたのだろうか。
後続する画面にてフレームワークを選択することになる。そこで提示される一覧の違いから、選択肢の違いを汲み取ることはできるのだが、最初から明確に理解、判別できるように明示するべきではないか、と一ユーザーとして思うのだ。

この3つ全てに対応する必要があるユーザーはごく限られているだろうし、おそらく大多数のユーザーは「Windowsフォームアプリケーション」の利用が中心で、そのうち先取の意識がある一部のユーザーが「WPFアプリケーション」も試してみたくらいではないか、と私は想像している。

今回の投稿は、この3つの違いについての紹介だ。


まず結論をまとめる。この3つの違いは次のように区別できる。

呼称 GUI Framework 構造 描画技術
1 Windowsフォームアプリケーション (.NET Framework) WinForms .NET Framework ロジック埋込 GDI
GDI+
2 Windowsフォームアプリ WinForms .NET Core
.NET 5.0~
ロジック埋込 GDI
GDI+
3 WPFアプリケーション WPF .NET Core
.NET 5.0~
ロジック分離 Direct3D

それぞれの項目を選択したとき、後続の画面でフレームワークを選択することになる。ここで一覧されるフレームワークの違いが、これら選択肢の違いを物語っている。

f:id:espio999:20211207230340p:plain
f:id:espio999:20211207230350p:plain

Windows用のデスクトップ・アプリケーションを作成する、という一般化した目的に沿えば、1~3のいずれも選択可能だ。このとき適切な選択肢を決定する決め手が、GUIフレームワークの選択というわけだ。

Windowsフォームアプリケーション (.NET Framework)

.NET FrameworkWindowsに標準添付されている。ただ開発すること以外、何も考慮することが無ければ、これを選ぶことになる。

注意したいのは.NET Frameworkのライフサイクルだ。.NET Framework 4.8を最後のバージョンとしており、いずれは、その他の選択肢を選ばざるを得ないときがやってくる。

.NET Framework 4.8 is the last version of .NET Framework.

Overview of .NET Framework - .NET Framework | Microsoft Docs

Windowsフォームアプリ

.NET Coreを採用するデスクトップ・アプリケーションを開発するに際し、GUIは従来通りにWinFormsを採用するならば、これを選ぶことになる。

.NET CoreはWindowsに標準添付されていないため、アプリケーションを配布する際には、.NET Coreの事前インストールを要求する必要がある。

WPFアプリケーション

最もモダンなWindowsアプリケーションの開発形態が、この選択肢だ。しかし、慌てて飛びつかないように。Microsoftは後述する「Windows App SDK」へ転進しようとしている。

WPF (Windows Presentation Foundation)では、XAML (eXtensible Application Markup Language)でGUIを定義し、.NET Coreを活用してロジックを構築する。さらに、これまでの選択肢との大きな違いは、プログラム構造と描画技術にある。

Androidなどのモバイル端末を対象とした開発に採用されているMVVM (Model View ViewModel)アーキテクチャに基づいて設計、実装することになる。
従来まではFormにアプリケーション・ロジックを記載していた。たとえアプリケーションの根本機能をDLLによって分離実装していたとしても、ボタンやテキストボックスなどの状態遷移、コントロールは、Form内に記述されていた。このようなロジック埋め込みを許さず、GUI (View)とロジックを分離するのがMVVMの流儀だ。
従って、従来とは異なる開発手順を経ることになる。画面デザインは、これまでツールボックスからドラッグ&ドロップで対応していた。これからはXAMLを記述して対応する。XAMLに対応したViewModelを作成し、そこにロジックを記述する。
考えようによっては、先の「Windowsフォームアプリ」は、このMVVMの流れに乗れない、あるいはこれが適さないプロジェクトのための選択肢にもなり得る。

WinFormsとWPFの、実装技術面での大きな違いは、その描画技術にある。即時モードと保持モードだ。この二つの説明については、次のサイトの解説が分かりやすい。
一言で済ませるならば、WPFはWinFormsに比べて描写が乱れにくい、と表現できるだろう。

Windows Formsの基盤描画技術となるGDIの場合、最終的なビデオメモリに書き込んでいるのはアプリケーション自身です。すなわち、アプリケーションが実行する描画命令と実画面のフレームバッファに書き込まれるタイミングは同期しています。このような描画の仕組みを「即時モード」のグラフィックシステムと言います。


一方WPFの場合、アプリケーションから描画命令を実行してもビジュアルオブジェクトをシリアル化した描画データが生成されるだけで、そのまま即ビデオメモリへの書き込みは行われません。アプリケーションの実行スレッドとは別のWPFの描画スレッドが、描画データをスキャンして非同期にDirect3Dのバッファに描画します。このような描画の仕組みを「保持モード」のグラフィックシステムと言います。

Windows FormsとWPFの比較(描画編) | GrapeCity.devlog - グレープシティ株式会社

Windows App SDKWindows UI Library (WinUI)

Windows 8以降、Microsoftはモバイル環境からデスクトップ環境まで、一貫して対応できる環境を整えようとしていた。WPFはその一部であったのだが、Project REUNIONがその方向性に変化をもたらした。このプロジェクトの正式名称が、Windows App SDKだ。Visual Studio拡張機能として利用することができる。

そこで提供されるGUIライブラリが、Windows UI Library (WinUI)だ。Windows 11以降は、このライブラリを使用したGUIが主流になると考えられるのだが…いまだにWinFormsが主流の現状においては、先のことは分からない、まだまだ様子見、というのが個人的見解だ。

docs.microsoft.com
docs.microsoft.com
docs.microsoft.com