次の方法で共有


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

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

  • 多くの場合、WPF アプリを WinUI 3 アプリの形式で再作成する必要があります。 WinUI に移行する利点の 1 つは、Fluent Design System にアクセスすることです (Design とコード Windows アプリ も参照)。 また、WinUI はWindows アプリ SDKの一部であるため、当然ながら、WinUI アプリでは他のWindows アプリ SDK機能や API も使用できます。 このトピックでは、WPF アプリを WinUI に移行するプロセスについては説明しません。
  • ただし、WinUI でまだ使用できないWPFの機能を使用している場合でも、WPF アプリでWindows アプリ SDK機能 (アプリ ライフサイクル、MRT Core、DWriteCore など) を使用できます。 このトピックでは方法を説明します。

既存のWPFプロジェクトがまだない場合やプロセスを練習したい場合でも、このトピックにはWPFプロジェクトを作成し、Windows アプリ SDK の API を呼び出すように構成する手順が含まれているので、一緒に進めてください。

前提条件

  1. Windows アプリ SDK のツールをインストールする
  2. このトピックでは、パッケージ化されていないアプリとパッケージ化されたWPFアプリの両方について説明します。 WPF アプリがパッケージ化されていない (既定では WPF アプリはパッケージ化されていません) 場合、パッケージ化されていないアプリのすべての依存関係がインストールされていることを確認してください。詳細は「外部の場所でパッケージ化されたフレームワーク依存アプリまたはパッケージ化されていないアプリのための Windows アプリ SDK 展開ガイド」を参照してください。 これを行う簡単な方法は、 Windows アプリ SDK 用のLatest ダウンロードにアクセスし、安定したリリース Runtime ダウンロードのいずれかをダウンロードして解凍して実行する方法です。

重要

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

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

WPF プロジェクトがまだない場合は作成する

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

  1. Visual Studioで、新しい C# WPF Application プロジェクト (.NET プロジェクト) を作成します。 WPF App (.NET Framework)ではなく、WPF Application という名前のプロジェクト テンプレートを選択してください。
  2. projectに名前を付け、既定のオプションをそのまま使用します。

パッケージ化されていないWPF アプリをビルドするプロジェクトが作成されました。

Windows アプリ SDK サポート用にWPF プロジェクトを構成する

まず、project ファイルを編集します。

  1. ソリューション エクスプローラーでprojectを右クリックし、[Edit Project File。

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

    <TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>
    
  3. 次に示すように、PropertyGroup 要素内に、RuntimeIdentifiers 要素を追加します。 .NET 8 以降を対象としている場合は、代わりに値 win-x86;win-x64;win-arm64 を使用します。

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

    <WindowsPackageType>None</WindowsPackageType>
    

    高度なニーズ (カスタムエラー処理、特定のバージョンの Windows アプリ SDK の読み込みなど) がある場合は、auto-initialization ではなく、ブートストラップ API を明示的に呼び出すことができます。詳細については、外部の場所でパッケージ化されたアプリまたは未パッケージ化アプリ向けの Windows アプリ SDK ランタイムの使用 を参照してください。

  5. project ファイルを保存して閉じます。

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

  1. ソリューション エクスプローラー で、プロジェクトの Dependencies ノードを右クリックし、 Manage Nuget Packages...
  2. NuGet パッケージ マネージャー ウィンドウで、Browse タブを選択し、Latest stableMicrosoft をインストールします。WindowsAppSDK パッケージ。

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

このセクションでは、WPF アプリから Windows アプリ 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 アプリ SDKの ResourceManager クラスを使用して文字列リソースを読み込むコードをいくつか追加します。

    1. 新しい Resources File (.resw) 項目をprojectに追加します (既定の名前は 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. projectをビルドし、アプリを実行します。 ボタンをクリックすると、"Hello, resources!" という文字列が表示されます。

ヒント

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

また、Runtime アーキテクチャを参照して、アプリがWindows アプリ SDKを使用するときにアプリが受け取るFramework パッケージの依存関係と、パッケージ化されていないアプリで動作するために必要な追加のコンポーネントについて説明します。

MSIX を使用してWPF アプリをパッケージ化して展開する

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

  1. Visual Studioの ソリューション エクスプローラー でソリューションを右クリックし、 Add>New Project...
  2. 新しいプロジェクトの追加 ダイアログ ボックスで、packaging を検索し、C# Windows Application Packaging Project プロジェクトテンプレートを選択し、Next をクリックします。
  3. projectに名前を付け、Create をクリックします。
  4. ソリューション内のどのアプリケーションをパッケージに含めるかを指定します。 パッケージ化プロジェクト(WPFプロジェクトではない)で、Dependencies ノードを右クリックし、[プロジェクト参照の追加...] を選択します。
  5. ソリューション内のプロジェクトの一覧で、WPF プロジェクトを選択し、OK をクリックします。
  6. パッケージ 化プロジェクトの Dependencies>Applications ノードを展開し、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 のないプロセスから呼び出された場合、例外をスローします。

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

バックグラウンドでコードを実行する

アプリが実行されていないときにコードを実行する必要があるWPFアプリの場合、パッケージ化とワークロードに応じて 3 つの方法があります。

方法 パッケージ化が必要 最適な用途
Windows アプリ SDKバックグラウンド タスク はい (MSIX) 電力効率の高いシステム管理トリガー (時間/システム)
タスク スケジューラ いいえ 定期的な同期、パッケージ化されていないアプリ
.NET Worker Services いいえ 実行時間の長いヘッドレス ワークロード、任意のデプロイ モデル

Windows アプリ SDKバックグラウンド タスクの場合、WPF アプリは WinUI 3 アプリと同様に BackgroundTaskBuilder を使用して COM コンポーネントを登録します。WPFの Application.Startup イベントは、WinUI 3 でApp.OnLaunched が果たすロールにマップされます。 完全なチュートリアルについては、「Windows アプリでのバックグラウンド タスクの使用を参照してください。

Windows アプリ SDKバックグラウンド タスクには MSIX パッケージ化が必要です。 パッケージ化されていないWPF アプリの場合は、代わりにタスク スケジューラまたは .NET Worker サービスを使用します。