WPF アプリでWindows App SDKを使用する

Windows App SDK は、次世代の Windows アプリ開発プラットフォームです。 このトピックでは、Windows Presentation Foundation (WPF) アプリで Windows App SDK API (および Windows ランタイム API) を使用する方法を説明します。

  • 多くの場合、WPF アプリは Windows UI ライブラリ 3 (WinUI 3) アプリの形式で再作成することをお勧めします。 WinUI 3 に移行する利点の 1 つは、Fluent Design Systemへのアクセスが可能になることです (「Windows アプリの設計とコーディング」も参照してください)。 また、WinUI 3 は Windows App SDK の一部であるため、WinUI 3 アプリでは Windows App SDK の他の機能や API も使用できます。 このトピックでは、WPF アプリを WinUI 3 に移行するプロセスについては説明しません。
  • WinUI 3 でまだ利用できない WPF の機能を使用している場合は、WPF アプリでも、Windows App SDK の機能 (アプリのライフサイクル、MRT Core、DWriteCore など) を使用することができます。 このトピックでは方法を説明します。

既存の WPF プロジェクトがない場合、または作成プロセスを実践しようとしている場合は、このトピックの手順に従うと、WPF プロジェクトを作成し、Windows App SDK API を呼び出すように構成できます。

前提条件

  1. Windows App SDK 用のツールをインストールする
  2. このトピックでは、非パッケージ WPF アプリとパッケージ WPF アプリの両方について説明します。 WPF アプリが非パッケージ (WPF アプリの既定の状態) の場合は、非パッケージ アプリのすべての依存関係がインストールされていることを確認してください (フレームワークに依存する、外部の場所を持つパッケージ アプリまたは非パッケージ アプリ向けの Windows App SDK 展開ガイドを参照してください)。 これを簡単に行うには、「Windows App SDK 用の最新のダウンロード」にアクセスし、安定版リリースのいずれかを [ランタイムのダウンロード] からダウンロードして、解凍および実行します。

重要

インストールするランタイムのバージョンは、後の手順でインストールする Microsoft.WindowsAppSDK NuGet パッケージのバージョンと一致している必要があります。

非パッケージパッケージという用語については、「アプリをパッケージ化することの長所と短所」を参照してください。

WPF プロジェクトを作成する (まだ作成していない場合)

既に WPF プロジェクトがある場合は、次のセクションに進むことができます。

  1. Visual Studio で、新しい C# WPF アプリケーション プロジェクト (.NET プロジェクト) を作成します。 このとき、[WPF アプリケーション] という名前のプロジェクト テンプレートを選択します。[WPF アプリ (.NET Framework)] ではないことに注意してください。
  2. プロジェクト名を設定し、既定のオプションをそのまま使用します。

これで、非パッケージ WPF アプリをビルドするプロジェクトが作成されました。

Windows App SDK をサポートするように WPF プロジェクトを構成する

まず、プロジェクト ファイルを編集します。

  1. ソリューション エクスプローラーで、プロジェクトを右クリックし、[プロジェクト ファイルの編集] を選択します。

  2. この手順では、Windows ランタイム (WinRT) API (Windows App SDK API を含む) を呼び出すことができるようにします。 PropertyGroup 要素内には TargetFramework 要素があり、net6.0 のような値に設定されています。 このターゲット フレームワークの値の末尾に、モニカー (具体的にはターゲット フレーム モニカー) を追加します。 たとえば、アプリが Windows 10 Version 2004 をターゲットとしている場合は、次のように指定します。

    <TargetFramework>net6.0-windows10.0.19041.0</TargetFramework>
    
  3. さらに、次に示すように、PropertyGroup 要素内に RuntimeIdentifiers 要素を追加します。 .NET 8 以降をターゲットとしている場合は、代わりに win-x86;win-x64;win-arm64 という値を使用してください。

    <RuntimeIdentifiers>win10-x86;win10-x64;win10-arm64</RuntimeIdentifiers>
    
  4. 既定では、WPF アプリは非パッケージ アプリになります (つまり、MSIX を使用してインストールされません)。 非パッケージ アプリでは、Windows App SDK のいずれかの機能を使用する前に、Windows App SDK ランタイムを初期化する必要があります。 自動初期化を使用すると、これをアプリの起動時に自動的に行うことができます。 そのためには、WindowsPackageType プロジェクト プロパティを次のように適切に設定するだけです (これも PropertyGroup 要素内で指定します)。

    <WindowsPackageType>None</WindowsPackageType>
    

    高度なニーズがある場合は (カスタム エラー処理が必要な場合や、特定のバージョンの Windows App SDK を読み込む場合など)、自動初期化の代わりに、ブートストラップ API を明示的に呼び出すことができます。詳細については、外部の場所を持つパッケージ アプリまたは非パッケージ アプリで Windows App SDK ランタイムを使用する方法に関するトピックを参照してください。

  5. プロジェクト ファイルを保存して閉じます。

次に、プロジェクトに Windows App SDK NuGet パッケージをインストールします。

  1. ソリューション エクスプローラーで、プロジェクトの [依存関係] ノードを右クリックし、[NuGet パッケージの管理] を選択します。
  2. [NuGet パッケージ マネージャー] ウィンドウで、[参照] タブを選択して、最新の安定版Microsoft.WindowsAppSDK パッケージをインストールします。

WPF アプリで Windows App SDK の機能を使用する

このセクションでは、WPF アプリから Windows App SDK API を呼び出す非常に簡単な例を示します。 この例は MRT Core の機能を使用します (「MRT Core を使用してリソースを管理する」を参照してください)。 この例を WPF プロジェクトに適用できる場合は (このチュートリアル用に新しいプロジェクトを作成した場合も該当します)、次の手順に従うことができます。

  1. MainWindow.xaml に次のマークアップを追加します (ルートの Grid 内に貼り付けることができます)。

    <StackPanel>
        <Button HorizontalAlignment="Center" Click="Button_Click">Click me!</Button>
        <TextBlock HorizontalAlignment="Center" x:Name="myTextBlock">Hello, World!</TextBlock>
    </StackPanel>
    
  2. 次に、Windows App SDK の ResourceManager クラスを使用して文字列リソースを読み込むコードを追加します。

    1. 新しいリソース ファイル (.resw) 項目をプロジェクトに追加します (既定の名前である Resources.resw をそのまま使用します)。

    2. エディターでリソース ファイルを開いて、次のプロパティを使用して新しい文字列リソースを作成します。

      • 名前: Message
      • 値: Hello, resources!
    3. リソース ファイルを保存して閉じます。

    4. MainWindow.xaml.cs に、次のイベント ハンドラーを追加します。

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        // Construct a resource manager using the resource index generated during build.
        var manager = 
          new Microsoft.Windows.ApplicationModel.Resources.ResourceManager();
    
        // Look up a string in the resources file using the string's name.
        myTextBlock.Text = manager.MainResourceMap.GetValue("Resources/Message").ValueAsString;
    }
    
  3. プロジェクトをビルドし、アプリを実行します。 ボタンをクリックすると、"Hello, resources!" という文字列が表示されます。

ヒント

実行時に、アプリケーションには特定のバージョンの Windows App ランタイムが必要であり、今すぐインストールするかどうかをたずねるメッセージ ボックスが表示された場合は、[はい] をクリックします。 これにより、「Windows App SDK 用の最新のダウンロード」ページが開きます。 詳細については、上の「前提条件」セクションを参照してください。

アプリで Windows App SDK を使用する場合に適用されるフレームワーク パッケージの依存関係の詳細と、非パッケージ アプリに必要な追加コンポーネントについては、ランタイム アーキテクチャに関するトピックを参照してください。

MSIX で WPF アプリをパッケージ化してデプロイする

Windows の一部の機能と API (Windows App SDK の通知 API を含む) では、実行時にアプリにパッケージ ID があることが求められます (つまり、アプリがパッケージ化されている必要があります)。 詳しくは、「パッケージ ID が必要な機能」を参照してください。

  1. Visual Studio のソリューション エクスプローラーで、ソリューションを右クリックし、[追加] >[新しいプロジェクト] の順に選択します。
  2. [新しいプロジェクトの追加] ダイアログ ボックスで、「パッケージ」を検索し、C# の [Windows アプリケーション パッケージ プロジェクト] プロジェクト テンプレートを選択して、[次へ] をクリックします。
  3. プロジェクトに名前を付け、[作成] をクリックします。
  4. ソリューション内のどのアプリケーションをパッケージに含めるかを指定します。 そのためには、パッケージ プロジェクトで (WPF プロジェクトではありません)、[依存関係] ノードを右クリックし、[プロジェクト参照の追加] を選択します。
  5. ソリューション内のプロジェクトの一覧で、WPF プロジェクトを選択し、[OK] をクリックします。
  6. パッケージ プロジェクトの [依存関係] >[アプリケーション] ノードを展開し、WPF プロジェクトが参照されて太字で強調表示されていることを確認します。 これは、これがパッケージの開始点として使用されることを意味します。
  7. パッケージ プロジェクトを右クリックし、[スタートアップ プロジェクトに設定] を選択します。
  8. WPF プロジェクトを右クリックし、[プロジェクト ファイルの編集] を選択します。
  9. <WindowsPackageType>None</WindowsPackageType> を削除し、保存して閉じます。
  10. [ソリューション プラットフォーム] ドロップダウンで、[x64] を選択します ([Any CPU] から変更します)。
  11. ビルドして実行できることを確認します。

これで WPF アプリがパッケージ化されたので、パッケージ ID を必要とする API を呼び出すことができます。 MainWindow.xaml.cs で、イベント ハンドラーを次のように編集します。

private void Button_Click(object sender, RoutedEventArgs e)
{
    var notification = new AppNotificationBuilder()
        .AddArgument("action", "viewConversation")
        .AddArgument("conversationId", "9813")
        .AddText("Andrew sent you a picture")
        .AddText("Check this out, The Enchantments in Washington!")
        .BuildNotification();

    AppNotificationManager.Default.Show(notification);
}

もう一度ビルドして実行します。 ボタンをクリックし、トースト通知が表示されることを確認します。 通知 API は、実行時にパッケージ ID のないプロセスから呼び出された場合、例外をスローします。

Note

このセクションの手順では、パッケージ アプリの作成方法を説明しました。 別の方法として、外部の場所を持つパッケージ アプリを作成することもできます。 これらの用語については、「アプリをパッケージ化することの長所と短所」を参照してください。