WPFとUWP、どちらを選ぶべき? 初心者のデスクトップアプリケーション開発のカタチ
2022-04-09
azblob://2022/11/11/eyecatch/2022-04-07-wpf-uwp-which-is-better-000.jpg

こんにちは。

私はプログラミングというものに初めて触れたのが10年ほど前で、その時はC#でWinFormを利用してWindows向けのデスクトップアプリケーションの開発をしていました。

そもそも触れるきっかけとなったのが

ちょっとした作業を効率化できるアプリケーションを開発してみたい

という突発的な気持ちでした。

WinFormを学べば学ぶほど難しいものを作りたくなり、それに伴って不足していると思う部分も増えてきました。

そこでWPFに出会い、今まで個人的な小物製作でお世話になってきました。

自分がWinFormからWPFに変えた理由は機能不足感と使いづらさでしたが、WPFUWPという選択肢が増えてから数年経った今、どちらを選ぶべきか用途と使用感、機能面から考えていこうと思います。

WPFとは

Windows Presentation Foundation (WPF) は、デスクトップ クライアント アプリケーションを作成する UI フレームワークです。 WPF 開発プラットフォームでは、アプリケーション モデル、リソース、コントロール、グラフィックス、レイアウト、データ バインディング、ドキュメント、セキュリティなど、広範なアプリケーション開発機能をサポートします。

https://docs.microsoft.com/ja-jp/visualstudio/designers/getting-started…

簡単に説明すると、Windows向けのデスクトップアプリケーションを開発する.NET系統のUIプラットフォームで、後述するUWPに似ているXAMLで記述するUIビルダーを備えています。分離されたコードではC#/VBが使用可能です。.NET Core 5 以降を使用すればx64/x86以外にもWindows ARM64やWindows以外に対応したアプリケーションも開発可能です。

UWPとは

ユニバーサル Windows プラットフォーム (UWP) は、Windows 10 デバイスと Windows 11 デバイスで実行されるアプリを作成するための 1 つの選択肢であり、他のプラットフォームと組み合わせることができます。 UWP アプリでは、Win32 API や .NET クラスを使用できます。

https://docs.microsoft.com/ja-jp/windows/uwp/get-started/universal-appl…

Win8.1向けのモダンアプリを開発するためのプラットフォームとして生まれ、派生したWin10/11向けのストアアプリを開発するためのプラットフォームです。こちらもWPFと同様にXAMLで記述できるUIビルダーを備えています。また、OSによって提供されるネイティブなAPIであるWinRTを使用しています。使用可能な言語はC#/VB/C++/JavaScriptです。

それぞれの違い

WPFとUWPでは、コードを記述していく手順についてはとても良く似ています。

しかし、そもそもできることや最終的に完成するアプリケーションの用途も違ってきます。

まず、ターゲット環境の違いがあります。WPFでは、.NETのフレームワークバージョンによってターゲットのバージョンをある程度調節できます。古い.NET フレームワークを使用すれば、WinXPなどの古いOSでの使用にも対応できます。UWPでは、Win10/11上でほぼ最新の機能を実装したアプリケーションが開発可能で、Windows7などのOSでは利用できません。

次に、アプリの公開方法の違いがあります。WPFアプリケーションはビルドした実行形式のファイルをそのまま配布して利用してもらうことができますが、UWPアプリケーションは基本的にはアプリ自体の申請を行って、Microsoft Storeで公開するという流れになります。

ターゲットを絞る必要があったり、手軽に利用できることが重要な場合はWPFを使うべきで、たくさんの人に利用してもらいたかったり、アプリを有料で公開したい場合はUWPを使うべきだと言えます。

また、標準で用意されているコントロールのデザインの違いがあります。WPFではUIデザインのプリセットが用意されていますが、OSのスタイルとは違った見た目になっています。OSのバージョンが違っても見た目が変わらないという利点はありますが、使用しているOSとの統一性は失われます。UWPはそもそもWin10/11向けなので、標準で用意されているXAMLコントロールはOSに準拠しているため、OSのUIとの統一性があります。

これに関してはXAMLで自分でリソースディクショナリを作成している人や、ライブラリを利用して統一している人には関係ないと思いますが、手軽に違和感のないアプリケーションを作るには重要かもしれません。

結局どちらを選べばいい?

一概には言えませんが、結局のところUWPは幅が狭く、まだ発展途上感が否めない印象があります。WPFはいろんな場面で応用が利くため、個人的には "個人でちょっとしたツールが作りたい" や "Windows 10/11 以外でも利用する可能性がある" という場合はWPFを、また、 "いろんな人に使ってもらいたい" や "有料で公開することも検討している" という場合はUWPを使うのがいいのかなと思います。

基本的には "WPFでは困らないがUWPだと困る" という場面が多い気がします。

WPFでUWPの機能を利用できるようにするXAML Islandなんかもあるので...

(あまり使う機会はないと思いますが)

最近では、MicrosoftがWinUI 3という新しいUIプラットフォームの開発を発表していたので、そちらにも期待したいですね。

既存のWindows 10 SDKと完全に分離されたUXフレームワークで、今までUWPで使えていた機能もそのまま使えてWPFの利点も同時に得られるようです。

Windows UI ライブラリ (WinUI) は、Windows デスクトップと UWP の両方のアプリケーションに対応したネイティブ ユーザー エクスペリエンス (UX) フレームワークです。

https://docs.microsoft.com/ja-jp/windows/apps/winui/