1. サボりアプリを開発しました
簡単なアプリ「Loaf(サボり)」を作りました。


上の画像のように、このアプリにはボタンが1つだけあり、クリックするとWindows Updateのふりをして、ユーザーは堂々とサボることができます。
サボりを軽んじてはいけません。天才的なアイデアはすべて、キーボードを叩いているときに生まれるわけではありません。仕事で行き詰まったとき、作業に没頭すればするほど解決策が見つからないものです。そんなときは画面から目を離し、シャワーを浴びながらアヒルのおもちゃで遊んだり、窓の外を眺めてぼんやりしたり、寝ながらお腹を触ったりしていると、問題解決のひらめきが突然頭の中に浮かんでくるものです。
そこで私は厚かましくもこのアプリを「効率的な作業」カテゴリに公開しました。なんとMicrosoftにも承認され、現在は以下のリンクからダウンロードできます。
https://www.microsoft.com/zh-cn/p/loaf-a-winui3-app/9ndj3q12nrrm

もちろん、タイトルにある通り、これはWinUI 3アプリです。
2. WinUI 3とは

WinUI 3は、WindowsアプリケーションSDKに付属する、WindowsデスクトップアプリケーションおよびUWPアプリケーション向けのネイティブユーザーエクスペリエンス(UX)フレームワークです。簡単に言うと、WinUI 3はUWPのUIレイヤーを分離して、Win32 Windowsアプリで利用できるようにしたものです。WinUI 3をより深く理解するには、以下のリンクを参照してください。
- Windows UI ライブラリ (WinUI) - Windowsアプリ
- Windows UI ライブラリ (WinUI) 3 - Windowsアプリ
- WindowsアプリケーションSDKを使用したデスクトップWindowsアプリの構築 - Windowsアプリ
- WindowsアプリケーションSDK安定版チャンネルのリリースノート - Windowsアプリ
- microsoft/microsoft-ui-xaml - Windows UI Library: 最新のWindows 10ネイティブコントロールとFluentスタイルをアプリケーションに
- microsoft-ui-xaml/roadmap
- WinUI 3試用レポート
- WinUI 3 Preview 3がリリース、再びそのパフォーマンスをテスト
長い待機期間を経て、最近WinUI 3が静かに正式版をリリースしたようです。大規模な宣伝もなければ、リリースされたばかりのVisual Studio 2022に統合されているわけでもなく、まともなメールやニュース、ブログも見当たりません。ドキュメントを見ると、WindowsアプリケーションSDKと一緒にリリースされたようで、現在WinUI 3の1.0バージョンが使用可能です。ひとしきり触ってみた結果、今のところ自分のアプリをWinUI 3に移行するのは時期尚早だと判断しました。ずっと待ち望んでいたにもかかわらずです。既存のアプリに手を加えられないため、WinUI 3をより深く試すために、この「Loaf」という小さなアプリを作成しました。
3. 開発プロセス
以下に開発プロセスを説明します。全体的には面白かったですが、多くの課題もありました。
まず、Visual Studio 2022でWinUI 3のC#アプリを開発する場合、拡張機能「WindowsAppSDK.Cs.Extension.Dev17.Standalone.vsix」をダウンロードする必要があります。この拡張機能をインストールして初めて、WinUI 3プロジェクトを作成できます。

C++やVisual Studio 2019用の拡張機能は、以下のドキュメントに各ダウンロードリンクがあります。
WindowsアプリケーションSDK安定版チャンネルのリリースノート - Windowsアプリ
プロジェクトを作成すると、WinUI 3にはデザインビューがないことがわかります(おそらく今後も追加されないでしょう)。そのため、UWPプロジェクトを別途作成し、UWPプロジェクトでXAMLをデザインしてからWinUI 3プロジェクトにコピーするのが最善策です。
移行中は、ほとんどの Windows.* 名前空間を Microsoft.* に置き換える必要があります。ただし、Win2Dではまだ Windows.* 名前空間を使用しているため、多少混乱します。
次に、さまざまなパッケージを参照する必要があります。Microsoftが管理するUWPで最も一般的に使用されるパッケージには、対応するWinUIバージョンがおおよそ存在します。たとえば、Microsoft.Toolkit.Uwp.UI は CommunityToolkit.WinUI.UI に、Win2D.uwp は Microsoft.Graphics.Win2D に置き換えられます。
UWPの開発経験の多くはWinUI 3でも活かせますが、この小さな「Loaf」アプリで最大の問題はウィンドウ管理でした。おそらくWinUI 3のWindow APIがまだ十分に設計されておらず、タイトルを変更するだけでも数行のコードが必要です。
namespace SampleApp
{
/// <summary>
/// 単独で使用できる、またはFrame内で移動できる空のウィンドウ。
/// </summary>
public sealed partial class MainWindow : Window
{
private AppWindow m_appWindow;
public MainWindow()
{
this.InitializeComponent();
// XAML WindowのAppWindowを取得
m_appWindow = GetAppWindowForCurrentWindow();
if (m_appWindow != null)
{
// AppWindowオブジェクトを取得したので、そのメソッドを呼び出してウィンドウを操作できる。
// ここでは例として、ウィンドウのタイトルを変更する。
m_appWindow.Title = "WinUI ❤️ AppWindow";
}
}
private AppWindow GetAppWindowForCurrentWindow()
{
IntPtr hWnd = WinRT.Interop.WindowNative.GetWindowHandle(window);
WindowId myWndId = Microsoft.UI.Win32Interop.GetWindowIdFromWindow(hWnd);
return AppWindow.GetFromWindowId(myWndId);
}
}
}
全画面表示に入るコードもUWPとは異なります。
/// 全画面表示に入る
m_appWindow.SetPresenter(AppWindowPresenterKind.FullScreen);
/// 全画面表示を終了する
m_appWindow.SetPresenter(AppWindowPresenterKind.Default);
さらに、UWPとは異なり、Escキーで全画面表示を終了できず、画面上部の非表示タイトルバーもありません。そのため、グローバルなEscキーイベントをキャプチャして、コードで全画面表示を終了する必要があります(タブレット状態で全画面表示を終了する方法はわかりません)。
もう一点、WinUI 3とUWPではスタイルが一部異なります。たとえば、ProgressRingのスタイルはWindows 8以降の点が回転するものではありません。幸い、UWPのStyleをコピーして少し修正するだけで対応できます。
開発中は多くの問題に直面しましたが、この小さなアプリにとってはまだ気軽なものでした。興味深いのは、WinUI 3が目的のAPIを提供していない場合、Win32 APIを直接呼び出して要件を満たせることです。さらに「興味深い」ことに、これらのWin32 APIの中には有効なものと無効なものがあります。
すべてのコードが完成したら、最後のステップはストアに公開することです。公開手順はUWPとほぼ同じで、現在ストアでこのアプリをダウンロードできます。
4. 遭遇した問題
デザインビューがないことは深刻な問題です。私自身は受け入れられますが、少なくともホットリロードが使えるからです。しかし、初心者には優しくありません。
ドキュメントが混乱しています。ほとんどすべてのUWPとWindowsアプリケーションSDKのドキュメントが統合されており、これは致命的です。本当に致命的です。たとえば、WinUI 3のドキュメントにはMicaへのナビゲーションがありますが、WinUI 3はMicaをサポートしていません。現在、https://docs.microsoft.com/en-us/windows/apps/ のページではUWPのエントリポイントすら見つけられず、UWPとWindowsアプリケーションSDKのドキュメントは混沌としています。
デモが役に立ちません。UWPのデモならまだしも、Windows 8のデモまで提示されるのはやりすぎです。
WindowsアプリケーションSDKという名前自体が問題です。どの検索エンジンでもWindows関連の大量の結果が表示され、WindowsアプリケーションSDKとは関係ありません。
Background AcrylicとRevealBorderBrushがなく、Win2DにもCanvasAnimatedControlがありません。これらの欠如により、UWPからWinUI 3への移行が難しくなっています。
開発から公開までの過程で、さまざまな一言では言い表せないバグや小さな問題に遭遇しました。
5. 最後に
かつてWinForms、WPF、Silverlightは非常に簡単に始められたのを覚えていますが、その後Microsoftの各UIフレームワークは次第に難しくなり、WinUI 3は最も難しいものになりました。UWPと比較して、WinUI 3には大きな利点があるはずですが、現時点では新しいバージョンを待つことをお勧めします。小さなアプリで遊ぶには良いですが、本番環境では注意が必要です。
一方、WinUI 2は面白くなってきているようです。WinUI 3の新バージョンを待つ間、WinUI 2で遊ぶのも良いでしょう。
6. ソースコード
https://github.com/DinoChan/Loaf
作者:Dino.C
出处:https://www.cnblogs.com/dino623/p/developing_an_app_with_winui3.html
版权:本文采用「CC BY 4.0」知识共享许可协议进行许可。