私は入社2年目の社員です。入社後の研修やOJTを通じて、C#でのWindowsフォームアプリケーションの開発を学びました。その後、WPF(Windows Presentation Foundation)を使ったアプリケーションを開発する機会がありました。
WPFで開発する中で、WPFと同じC#とXAML(Extensible Application Markup Language)で画面を作成できるWindows向けの新しいUIフレームワークである WinUI 3に興味が湧きました。今後Windowsアプリを作成するときに、WinUI 3は選択肢になるのか、自分で作って確かめてみたいと思い、技術レポートの機会を利用して検証することにしました。
題材には電卓アプリを選びました。ソフテックでは新入社員の技術研修でC#のWindows Formsを使って電卓アプリを作成します。研修で作成した馴染みのある電卓アプリをまずはWPFで作ってみて、さらにWinUI 3で作ると、同じアプリのフレームワークによる違いを比較しやすいのではないかと考えたためです。
今回の技術レポートでは、初学者がWinUI 3開発環境の構築からWPFとWinUI 3で同じアプリを作成して比較・検証してみた結果を紹介します。
WinUIはUWP(Universal Windows Platform)向けのUIライブラリとして、開発されたもので、WinUI 3からはデスクトップアプリケーションに対象が広がりました。
2-1. 開発環境の準備
WinUI 3開発では、Microsoft公式のクイックスタートを参照して、Visual Studio 2026 Communityをインストールし、Visual Studio Installerで「WinUIアプリケーション開発」のワークロードを選択、インストールしました。また、Visual Studioから作成したアプリをデバッグ実行するために、Windowsの開発者モードを有効にしました。
Visual StudioからMSIXとしてローカル配置・実行でき、Windows App Runtimeの依存関係を含めた開発時の動作確認を行いやすいため、UI動作確認ではPackageプロファイルを使用しました。性能測定では、WPF版と実行条件をそろえるため、WinUI 3版も自己完結型でフォルダー発行し、発行先のexeを直接実行しました。
2-2. 開発・実行環境
今回の検証の開発・実行環境は以下の通りです。
| 項目 |
内容 |
| OS/アーキテクチャ |
Windows11(バージョン:25H2)、x64 |
| 開発環境 |
Visual Studio 2026 Community |
| WinUI 3 |
Windows App SDK 2.4.0 |
| 対象フレームワーク |
WinUI 3:net10.0-windows10.0.19041.0、WPF:net10.0-windows |
3-1. WPF版アプリの作成
Windowsの標準電卓アプリを参考にして、UIは極力近づけて、最低限の機能を有した電卓アプリを作成しました。
実際にWPFで業務用アプリケーションを作成する場合には、複数の画面を管理しやすいMVVMとすることが多いと思いますが、今回の電卓アプリは単一画面のため、コードビハインドで作成しています。

図1 電卓アプリ画面(WPF)
3-2. WinUI 3への移植
次に3-1で作成した画面定義やイベントハンドラ等をWinUI 3に移していきます。両方XAMLで画面定義するため基本的には変更する必要ありませんが、WinUI 3対応するために2点変更する必要がありました。
まず1つ目は名前空間です。
WPFとWinUI 3はそれぞれ独自のAPIを持っているため、同じような役割のコントロールでもWPFは「System.Windows.Controls;」で、WinUI 3は「Microsoft.UI.Xaml.Controls;」のように所属する名前空間やクラスが異なります。今回のプログラムにおいては名前空間を変更するだけで基本的には同様の挙動になっていますが、実際には異なるAPI、クラスを扱っています。
2つ目はウィンドウサイズです。
WPFでは、XAMLでWidth/Height/MinWidth/MinHeightを定義することで、初期サイズと最小サイズを指定できます。一方、WinUI 3ではXAMLで各コントロールのサイズを指定することはできますが、画面サイズを指定することができません。そのため、コード側で起動時にAppWindow.Resizeで初期サイズを設定する必要があります。またAppWindowで設定する値は物理ピクセルであるため、有効ピクセルで設定されているWPF版画面と揃えるためにはDPI変換をする必要があります。
WPF版電卓アプリから上記2点のみを修正したWinUI 3版電卓アプリ画面が図 2です。

図2 電卓アプリ画面(WinUI 3)
3-3. WinUI 3版アプリの修正
図 1と図 2を比較すると特にテーマ、フォント、ボタンの配置方法に違いがみられます。まずテーマについて、開発環境ではダークテーマを設定しています。WPF版ではOSのテーマから影響を受けることなく、ライトテーマの見た目になっていますが、WinUI 3版ではOSテーマの影響を受けてボタンやテキストボックスの文字色が白くなっています。これをRequestedTheme="Light"を指定することで、WPF版と同様にライトテーマの見た目になりました。
次にフォントについてです。WPFでは、Windowsの言語環境に依存するため、今回の開発環境である日本語OSでは、標準フォントとしてYu Gothic UIが使用されます。
一方、WinUI 3では、アプリ側の言語設定(Package.appxmanifestのResource Language)に依存します。今回のプロジェクトでは、Resource Language="x-generate"としていたため、標準フォントとして、Segoe UIが使用されます。Package.appxmanifestでResource Language="ja-JP"と指定することで、WPF版と同様にXAML上で指定しなくても、Yu Gothic UIが使用されるようになりました。
最後にボタンの配置方法についてです。WPF版では、6行×4列のグリッドの各マス全体にボタンが広がるように表示されました。一方、WPF版の画面定義をそのままコピーした状態のWinUI 3版では、マス全体ではなくボタンの内容に応じた大きさで表示されました。Setter Property="HorizontalAlignment" Value="Stretch"やSetter Property="VerticalAlignment" Value="Stretch"のように水平方向・垂直方向のストレッチを指定することで、WPF版と同様にすべてのボタンがグリッドの各マス全体に表示するようになりました。
またWinUI 3のUIコントロールには、Fluent Designに基づいたWindows11標準のモダンな見た目になるように既定値が設定されています。今回の電卓アプリ画面では角丸などのデザインが目立つほどではありませんでしたが、こうした既定のデザインがWPF版との見た目の違いにつながっています。CornerRadiusやPadding、BorderThicknessなどの値を調整することでよりWPF版画面に近づけています。
3-2で作成したWinUI 3画面から上記3点を修正したWinUI 3版電卓アプリ画面とWPF版電卓画面の比較を図 3に示します。


図3 電卓アプリ画面(左:WPF、右:WinUI 3)
ここまで見た目をWPF版に近づけるために調整してきましたが、特に苦労したのは、修正した画面を確認する方法でした。WPFではVisual StudioのXAMLデザイナー(図 4)を使って、画面を確認しながら編集できます。一方、今回のWinUI 3開発では同じようなGUIデザイナーがサポートされていないため、アプリを実行してXAMLのリアルタイムプレビュー(図 5)で確認する必要がありました。ボタンの余白や配置などを少し変更するたびに、アプリを実行して結果を確認しました。

図4 Visual Studio XAML デザイナーを用いたWPF版電卓アプリ開発画面

図5 XAMLのリアルタイムプレビューを用いたWinUI 3版電卓アプリ開発画面
3-4. 性能比較
3-1〜3-3でフレームワークによるUIの違いを見てきたので、次にフレームワークによる性能の違いも比較してみました。.NET 10/Release/x64/自己完結型/フォルダー発行で条件を揃えて、各10回実行して測定したデータが以下の表です。
起動時間はフレームワーク間の差をなくすために、プロセスの起動から WaitForInputIdle()の完了とMainWindowHandleの取得を両方確認するまでの時間を計測しました。これは画面が描画されたタイミングや初期化が完了したタイミングとは異なります。
メモリとCPU使用率に関しては、起動直後のDLL読み込みや画面生成による一時的な変動を避けるため、起動から5秒経過以降の0.5秒間隔で取得した値から平均値を算出しています。
電卓のボタン操作や計算処理を行うときのCPU使用率や処理速度の比較を検討しましたが、操作のタイミングやスピードによって測定値が変わってしまうため、同じ条件で比較することが難しいと判断しました。
そこで、人の操作によるばらつきを抑えて測定できる項目として起動時間、ワーキングセット、プライベートメモリを比較することにしました。アプリの起動から測定値の取得、集計をスクリプトで自動化して、WPF版とWinUI 3版に同じ手順を適用することで、同一条件のデータとして比較できるようにしました。
表1. WPF版電卓アプリとWinUI 3版電卓アプリの性能比較
| 項目 |
WPF版 |
WinUI 3版 |
| 起動時間(平均値) |
533.2ms |
292.8ms |
| 起動時間(中央値) |
535.3ms |
301.0ms |
| ワーキングセット |
125.9MB |
132.6MB |
| プライベートメモリ |
85.1MB |
73.3MB |
起動時間、プライベートメモリはWinUI 3版の方が、ワーキングセットはWPF版の方が少ないといったデータとなりました。このデータはあくまで今回の環境で作成した電卓アプリにおいて、WPF版とWinUI 3版を比較したものにすぎません。そのため、フレームワーク間の性能の優劣を判断するものではなく、あくまで参考程度のデータです。
WPFを学んだあとにWinUI 3を試したため、XAMLによる画面定義、データバインディング、イベント処理といった基本的なUI設計についてはスムーズに進められました。まず WPF版のアプリを作成して、画面定義をコピーしてWinUI 3に合わせて修正するという手順をとったことで、名前空間、コントロールの既定値などのフレームワーク差がとても分かりやすかったです。
一方で、Package/Unpackagedや開発者モード、Windows App Runtimeなど開発・実行環境や配布方法に大きな差があることも感じました。
特に不便に感じたのは、GUIデザイナー(Visual Studio XAML デザイナー)がWinUI 3ではサポートされていないことです。
今回、題材に電卓アプリを選んだのは、新入社員向けの技術研修で作成するアプリをWPFとWinUI 3でも作れば、同じアプリを通じてフレームワークの違いを比較しやすいと考えたためです。実際に、基本的な画面や機能を揃えて作ることで、実装方法やコントロールの違いを確認できました。一方、電卓は画面や操作がシンプルなため、WinUI 3ならではのWindows 11に準拠したデザインを確認するには、題材として物足りなかったと感じています。もう少し複雑なアプリケーションであれば、フレームワークによる見た目や操作性の違いをより深く比較できたかもしれません。
今回、WPFとWinUI 3で同じ電卓アプリを作って比較した結果、今後の業務アプリ開発でも、WPFを選ぶことが多くなりそうだと感じました。産業用ソフトウェアではWindows 11に合わせたUIを求められる場面が限られることに加え、既存のWPF資産を活用でき、安定した開発・保守を続けやすいためです。
新規にWindows11向けのUIとして開発する場合にはWinUI 3も選択肢になると感じました。今回の電卓アプリではWinUI 3ならではのデザインを十分に確認できなかったため、今後は別の題材でも試してみたいと思います。