Introduction

Windows App SDKを使い始めたい。
UWPはお察しの通り、もうMicrosoftの投資対象になるテクノロジーではないので。

できれば、WPFをベースにして、そこにモダンなテクノロジーを混ぜていきたい。
それができるのがどうか、手を動かしてみる。

Get Started

Windows App SDK を使えるようにする

2022/01/31時点で、Windows App SDKは1.0がStable。
この辺りは Stable channel release notes for the Windows App SDK を参照。
日本語訳は分かりにくいのでお勧めしない。

Visual Studio で開発を始めるにあたり、Visual Studio extension をインストールする必要がある。
上のページからダウンロード。
C#とC++の拡張機能があるのでお好みで。

下記はC#の拡張機能。

extension

extension

extension

Visual Studioに関係するプロセスが起動していると終了してほしい旨が出るので、終了させる。

extension

extension

exe で配布したい

誰もかれもがMicrosoft Store経由でアプリを配布したいわけじゃない。
このあたりの開発者の事情をくみ取れなかったからUWPは受けいれられなかった。

で、従来の方法 (非パッケージ アプリ呼称) で配布するには、インストール先にSDKをインストールする必要がある模様。
これも上の The .exe installer, and MSIX packages というリンクから入手できる。

とりあえず、これは後回し。
アプリを作って、exe形式になっていることを確認できないと意味がないので。

プロジェクト作成

拡張機能インストール後、Visual Studioの新規作成ダイアログに WinUI 3 のテンプレートが追加されている。

extension

  1. クラスライブラリ (デスクトップの WinUI 3)
  2. 空のアプリ、パッケージ化 (デスクトップの WinUI 3)
  3. 空白のアプリ、Windows アプリケーション パッケージ プロジェクトでパッケージ化 (デスクトップの WinUI 3)

…下2つを見て意味が分かる人います?

Create a WinUI 3 app を見て、なんとなく理解するが、前者はMSIXでパッケージ化するための設定が一つにまとまっていて、後者はその設定が別のプロジェクトになっているという意味。

extension

左が 2.**、右が **3.

とりあえず動かしてみる

空のアプリ、パッケージ化

extension

期待通りの結果。

extension

勝手に配置されるのもUWPと一緒。

空白のアプリ、Windows アプリケーション パッケージ プロジェクトでパッケージ化

extension

スタートアップ プロジェクトを Package ではないほう にしてデバッグ実行したらクラッシュ。

extension

Packageのほうを起動したら、期待通りの結果。

extension

勝手に配置された。

exe ができてる

後者の 空白のアプリ、Windows アプリケーション パッケージ プロジェクトでパッケージ化 の Package ではないプロジェクト側のbinを見ると、exeができていた。

extension

上のMicrosoftの説明通り、Packageプロジェクトを介することでパッケージされるということで、Packageではないほう、つまりプログラム側はデスクトップアプリなのだろう。

では、なぜクラッシュしたのか?という答えが、先に書いた The .exe installer, and MSIX packages なのだろうと思ってインストールしたが変わらず。

やっぱり後回し。

コードの実体は?

UWPに近い構成で

  • app.manifest
  • App.xaml
  • App.xaml.cs
  • MainWindow.xaml
  • MainWindow.xaml.cs

となっている。

App.xaml.cs

素直な感じがする。
依存関係の注入はここからやればいいかな?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
namespace App2
{
/// <summary>
/// Provides application-specific behavior to supplement the default Application class.
/// </summary>
public partial class App : Application
{
/// <summary>
/// Initializes the singleton application object. This is the first line of authored code
/// executed, and as such is the logical equivalent of main() or WinMain().
/// </summary>
public App()
{
this.InitializeComponent();
}

/// <summary>
/// Invoked when the application is launched normally by the end user. Other entry points
/// will be used such as when the application is launched to open a specific file.
/// </summary>
/// <param name="args">Details about the launch request and process.</param>
protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args)
{
m_window = new MainWindow();
m_window.Activate();
}

private Window m_window;
}
}

MainWindow.xaml

特に言うことは無い。
Window周りでどれだけ細かい制御ができるかが肝。

1
2
3
4
5
6
7
8
9
10
11
12
13
<Window
x:Class="App2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App2"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">

<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button x:Name="myButton" Click="myButton_Click">Click Me</Button>
</StackPanel>
</Window>

まとめ

まずは軽く動かしてみた。
いろいろ気になる点はあるけど、少しずつ調べていく。