UWP Photo Editor サンプル アプリの Windows App SDK への移行 (C++/WinRT)

このトピックは、C++/WinRT UWP Photo Editor サンプル アプリを取得し、それを Windows App SDK に移行するというケース スタディです。

重要

移行プロセスに取り組む際の考慮事項と戦略や、移行用の開発環境を設定する方法については、「全体的な移行戦略」を参照してください。

Windows App SDK 用のツールをインストールする

開発コンピューターをセット アップするには、「Windows App SDK 用のツールをインストールする」を参照してください。

重要

リリース ノートのトピックと、「Windows App SDK のリリース チャネル」のトピックをご覧ください。 各チャネルのリリース ノートがあります。 これらのリリース ノートに記載されている制限事項と既知の問題を必ず確認してください。このケース スタディを実行したり、移行したアプリを実行したりした結果に影響を与える可能性があるためです。

新しいプロジェクトを作成する

  • Visual Studio で、Blank App、Packaged (デスクトップの WinUI 3) プロジェクト テンプレートから新しい C++/WinRT プロジェクトを作成します。 プロジェクトに PhotoEditor という名前を付け、[ソリューションとプロジェクトを同じディレクトリに配置する] チェックボックスをオフにします。 クライアント オペレーティング システムの最新リリース (プレビューではないもの) をターゲットにすることができます。

注意

サンプル プロジェクトの UWP バージョン (リポジトリから複製したもの) を "ソース" ソリューション/プロジェクトと呼びます。 Windows App SDK バージョンを "ターゲット" ソリューション/プロジェクトと呼びます。

コードを移行する順序

MainPage は、アプリの重要な目立つ部分です。 ただし、その移行から始めようとすると、MainPageDetailPage ビューに依存しており、その DetailPagePhoto モデルへの依存関係があることがすぐにわかります。 そのため、今回のチュートリアルでは、このアプローチを採用します。

  • まず、アセット ファイルをコピーします。
  • 次に、Photo モデルを移行します。
  • 次に、App クラスを移行します (DetailPageMainPage が依存するメンバーをこちらに追加する必要があるため)。
  • 次に、ビューの移行を開始します。最初に DetailPage から始めます。
  • 最後に、MainPage ビューを移行します。

ソース コード ファイル全体をコピーします。

このチュートリアルでは、エクスプローラーを使用してソース コード ファイルをコピーします。 ファイルの "内容" をコピーする場合は、このトピックの最後にある「付録: Photo モデルのファイルの内容をコピーする」セクションを参照して、Photo に関する手順の例を確認してください (その後、プロジェクト内の他のタイプに同様の手順を適用できます)。 ただし、このオプションにはさらに多くの手順が含まれます。

アセット ファイルをコピーする

  1. エクスプローラーで、ソース プロジェクトの複製内のフォルダー Windows-appsample-photo-editor>PhotoEditor>Assets を見つけます。 そのフォルダーには 8 つのアセット ファイルがあります。 その 8 つのファイルを選択し、クリップボードにコピーします。

  2. また、エクスプローラーで、作成したターゲット プロジェクト内の対応するフォルダーを見つけます。 そのフォルダーのパスは PhotoEditor>PhotoEditor>Assets です。 コピーしたアセット ファイルをそのフォルダーに貼り付け、コピー先に既に存在する 7 つのファイルを置き換えるというプロンプトを受け入れます。

  3. Visual Studio のソリューション エクスプローラーで、ターゲット プロジェクトの Assets フォルダーを展開します。 貼り付けた既存の bg1.png アセット ファイルをそのフォルダーに追加します。 アセット ファイルの上にマウス ポインターを置きます。 それぞれにサムネイル プレビューが表示されるため、アセット ファイルが正しく置き換えられたか、または追加されたことを確認します。

Photo モデルを移行する

Photo は、写真を表すランタイム クラスです。 これはモデルです (モデル、ビュー、およびビュー モデルの意味において)。

Photo ソース コード ファイルをコピーする

  1. エクスプローラーで、ソース プロジェクトの複製内のフォルダー Windows-appsample-photo-editor>PhotoEditor を見つけます。 そのフォルダーには、3 つのソース コード ファイル (Photo.idlPhoto.hPhoto.cpp) があります。これらのファイルが合わさって Photo ランタイム クラスを実装します。 これらの 3 つのファイルを選択し、クリップボードにコピーします。

  2. Visual Studio でターゲット プロジェクト ノードを右クリックし、[エクスプローラーでフォルダーを開く] をクリックします。 これにより、エクスプローラーでターゲット プロジェクト フォルダーが開きます。 コピーした 3 つのファイルをそのフォルダーに貼り付けます。

  3. ソリューション エクスプローラーに戻り、ターゲット プロジェクト ノードを選択して、[すべてのファイルを表示] がオンになっていることを確認します。 貼り付けた 3 つのファイルを右クリックし、[プロジェクトに含める] をクリックします。 [すべてのファイルを表示] をオフに切り替えます。

  4. ソリューション エクスプローラーでは、ソース プロジェクト内で、Photo.h.cppPhoto.idl の下に入れ子になっており、そこから生成されたものである (依存関係がある) ことを示しています。 その配置が気に入ったら、手動で \PhotoEditor\PhotoEditor\PhotoEditor\PhotoEditor.vcxproj を編集することで、ターゲット プロジェクトで同じことを行うことができます (まず Visual Studio ですべて保存する必要があります)。 次の文字列を検索します。

    <ClInclude Include="Photo.h" />
    

    それをこちらに置き換えます。

    <ClInclude Include="Photo.h">
      <DependentUpon>Photo.idl</DependentUpon>
    </ClInclude>
    

    Photo.cpp についても同じ手順を繰り返し、プロジェクト ファイルを保存して閉じます。 フォーカスを Visual Studio に戻したら、[再読み込み] をクリックします。

Photo ソース コードを移行する

  1. Photo.idl で、名前空間名 Windows.UI.Xaml (UWP XAML の名前空間) を検索し、Microsoft.UI.Xaml (WinUI XAML の名前空間) に変更します。

注意

UWP API を Windows App SDK にマッピングする」トピックでは、UWP API から同等の Windows App SDK へのマッピングを行います。 上記で行った変更は、移行プロセス中に必要な名前空間名の変更の例です。

  1. Photo.cpp の既存の include ディレクティブに #include "Photo.g.cpp" を追加します (#include "Photo.h" の直後)。 これは、UWP と Windows App SDK のプロジェクトの間でのフォルダー名とファイル名の違い (C++/WinRT) として知っておくべきことの 1 つです。

  2. コピーして貼り付けたファイルのすべてのソース コードの内容で、次の検索/置換 (大文字と小文字を区別し、完全に一致する単語) を行います。

    • Windows::UI::Xaml =>Microsoft::UI::Xaml
  3. ソース プロジェクトの pch.h から次の include をコピーして、ターゲット プロジェクトの pch.h に貼り付けます。 これは、ソース プロジェクトに含まれているヘッダー ファイルのサブセットであり、これまでに移行したコードをサポートするために必要なヘッダーにすぎません。

    #include <winrt/Microsoft.UI.Xaml.Media.Imaging.h>
    #include <winrt/Windows.Storage.h>
    #include <winrt/Windows.Storage.FileProperties.h>
    #include <winrt/Windows.Storage.Streams.h>
    
  4. 次に、ターゲット ソリューションをビルドできることを確認します (ただし、まだ実行しないでください)。

App クラスを移行する

ターゲット プロジェクトの App.idlApp.xaml を変更する必要はありません。 ただし、App クラスに新しいメンバーを追加するために、App.xaml.h と App.xaml.cpp を編集する必要があります。 各セクション (App::OnLaunched に関する最後のセクションを除く) の後にビルドできるような方法で行います。

メイン ウィンドウ オブジェクトを使用可能にする

この手順では、「Windows.UI.Xaml.Window.Current を App.Window に変更する」で説明されている変更を行います。

ターゲット プロジェクトでは、App はメイン ウィンドウ オブジェクトをプライベート データ メンバー window に格納します。 移行プロセスの後半 (ソース プロジェクトでの Window.Current の使用の移行) では、その window データ メンバーが static で、アクセサー機能からも使用可能になると便利です。 そのため、次にこの変更を行います。

  • window を static にするため、コードで現在使用されている既定のメンバー初期化子を使用するのではなく、App.xaml.cpp で初期化する必要があります。 これらの変更が、App.xaml.hApp.xaml.cpp でどのように表示されるかを示します。

    // App.xaml.h
    ...
    struct App : AppT<App>
    {
         ...
         static winrt::Microsoft::UI::Xaml::Window Window(){ return window; };
    
    private:
         static winrt::Microsoft::UI::Xaml::Window window;
    };
    ...
    
    // App.xaml.cpp
    ...
    winrt::Microsoft::UI::Xaml::Window App::window{ nullptr };
    ...
    

App::OnNavigationFailed

Photo Editor サンプル アプリは、ナビゲーション ロジックを使用して MainPageDetailPage の間を移動します。 ナビゲーションが必要 (および不要) な Windows App SDK アプリの詳細については、「ページ ナビゲーションを実装する必要がありますか?」を参照してください。

そのため、次のいくつかのセクションで移行するメンバーはすべて、アプリ内のナビゲーションをサポートするために存在します。

  1. まず、OnNavigationFailed イベント ハンドラーを移行しましょう。 ソース プロジェクトからそのメンバー関数の宣言と定義をコピーし、ターゲット プロジェクト (App.xaml.h および App.xaml.cpp) に貼り付けます。

  2. App.xaml.h に貼り付けたコードで、Windows::UI::XamlMicrosoft::UI::Xaml に変更します。

App::CreateRootFrame

  1. ソース プロジェクトには、App::CreateRootFrame というヘルパー関数が含まれています。 ソース プロジェクトからそのヘルパー関数の宣言と定義をコピーし、ターゲット プロジェクト (App.xaml.h および App.xaml.cpp) に貼り付けます。

  2. App.xaml.h に貼り付けたコードで、Windows::UI::XamlMicrosoft::UI::Xaml に変更します。

  3. App.xaml.cpp に貼り付けたコードで、Window::Current() の 2 つの出現箇所を window に変更します (以前取り上げた、App クラスのデータ メンバーの名前です)。

App::OnLaunched

ターゲット プロジェクトには、OnLaunched イベント ハンドラーの実装がすでに含まれています。 そのパラメーターは、Microsoft::UI::Xaml::LaunchActivatedEventArgs への定数参照であり、Windows App SDK に適しています (Windows::ApplicationModel::Activation::LaunchActivatedEventArgs を使用するソース プロジェクトとは対照的で、これは UWP に適しています)。

  • ターゲット プロジェクトの App.xaml.cppApp::OnLaunched が次のリストのようになるように、OnLaunched の 2 つの定義 (ソースとターゲット) をマージする必要があります。 (UWP バージョンのように Window::Current() の代わりに) window を使用することに注意してください。

    void App::OnLaunched(LaunchActivatedEventArgs const&)
    {
         window = make<MainWindow>();
    
         Frame rootFrame = CreateRootFrame();
         if (!rootFrame.Content())
         {
             rootFrame.Navigate(xaml_typename<PhotoEditor::MainPage>());
         }
    
         window.Activate();
    }
    

上記のコードは AppMainPage への依存関係を与えることになるため、DetailPage とさらに MainPage を移行するまで、この時点からビルドすることはできません。 再びビルドできるようになったら、お知らせします。

DetailPage ビューを移行する

DetailPage は、Win2D 効果の切り替え、設定、連結が行われるフォト エディター ページを表すクラスです。 MainPage で写真のサムネイルを選択すると、フォト エディター ページが表示されます。 DetailPage はビューです (モデル、ビュー、およびビュー モデルの意味において)。

Win2D NuGet パッケージを参照する

DetailPage のコードをサポートするために、ソース プロジェクトには Microsoft.Graphics.Win2D への依存関係があります。 そのため、ターゲット プロジェクトでは Win2D への依存関係も必要になります。

  • Visual Studio のターゲット ソリューションで、[ツール]>[NuGet パッケージ マネージャー]>[ソリューションの NuGet パッケージの管理...]>[参照] の順にクリックします。 [プレリリースを含める] チェックボックスがオフになっていることを確認し、Microsoft.Graphics.Win2D を検索ボックスに入力するか、貼り付けます。 検索結果で適切な項目を選択し、PhotoEditor プロジェクトを確認し、[インストール] をクリックしてパッケージをインストールします。

DetailPage ソース コード ファイルをコピーする

  1. エクスプローラーで、ソース プロジェクトの複製内のフォルダー Windows-appsample-photo-editor>PhotoEditor を見つけます。 そのフォルダーには、4 つのソース コード ファイル (DetailPage.idlDetailPage.xamlDetailPage.hDetailPage.cpp) があります。これらのファイルが合わさって DetailPage ビューを実装します。 この 4 つのファイルを選択し、クリップボードにコピーします。

  2. Visual Studio でターゲット プロジェクト ノードを右クリックし、[エクスプローラーでフォルダーを開く] をクリックします。 これにより、エクスプローラーでターゲット プロジェクト フォルダーが開きます。 コピーした 4 つのファイルをそのフォルダーに貼り付けます。

  3. 引き続きエクスプローラーで、DetailPage.hDetailPage.cpp の名前をそれぞれ DetailPage.xaml.hDetailPage.xaml.cpp に変更します。 これは、UWP と Windows App SDK のプロジェクトの間でのフォルダー名とファイル名の違い (C++/WinRT) として知っておくべきことの 1 つです。

  4. ソリューション エクスプローラーに戻り、ターゲット プロジェクト ノードを選択して、[すべてのファイルを表示] がオンになっていることを確認します。 貼り付けた (名前を変更した) 4 つのファイルを右クリックして、[プロジェクトに含める] をクリックします。 [すべてのファイルを表示] をオフに切り替えます。

  5. ソリューション エクスプローラーでは、ソース プロジェクト内で DetailPage.idlDetailPage.xaml の下に入れ子になっています。 その配置が気に入ったら、手動で \PhotoEditor\PhotoEditor\PhotoEditor\PhotoEditor.vcxproj を編集することで、ターゲット プロジェクトで同じことを行うことができます (まず Visual Studio ですべて保存する必要があります)。 次の文字列を検索します。

    <Midl Include="DetailPage.idl" />
    

    それをこちらに置き換えます。

    <Midl Include="DetailPage.idl">
      <DependentUpon>DetailPage.xaml</DependentUpon>
    </Midl>
    

プロジェクト ファイルを保存して閉じます。 フォーカスを Visual Studio に戻したら、[再読み込み] をクリックします。

DetailPage ソース コードを移行する

  1. DetailPage.idl で、Windows.UI.Xaml を検索し、それを Microsoft.UI.Xaml に変更します。

  2. DetailPage.xaml.cpp で、#include "DetailPage.h"#include "DetailPage.xaml.h" に変更します。

  3. そのすぐ下に、#include "DetailPage.g.cpp" を追加します。

  4. 引き続き DetailPage.xaml.cpp で、静的な App::Window メソッド (これから追加予定) を呼び出してコンパイルする場合、#include "Photo.h" の直前に #include "App.xaml.h" を追加します。

  5. コピーして貼り付けたファイルのソース コードの内容で、次の検索/置換 (大文字と小文字を区別し、完全に一致する単語) を行います。

    • DetailPage.xaml.h.xaml.cpp では、Windows::UI::Composition = >Microsoft::UI::Composition
    • DetailPage.xaml.h.xaml.cpp では、Windows::UI::Xaml = >Microsoft::UI::Xaml
    • DetailPage.xaml.cpp では、Window::Current() =>App::Window()
  6. ソース プロジェクトの pch.h から次の include をコピーして、ターゲット プロジェクトの pch.h に貼り付けます。

    #include <winrt/Windows.Graphics.Effects.h>
    #include <winrt/Microsoft.Graphics.Canvas.Effects.h>
    #include <winrt/Microsoft.Graphics.Canvas.UI.Xaml.h>
    #include <winrt/Microsoft.UI.Composition.h>
    #include <winrt/Microsoft.UI.Xaml.Input.h>
    #include <winrt/Windows.Graphics.Imaging.h>
    #include <winrt/Windows.Storage.Pickers.h>
    
  7. また、pch.h の上部で #pragma once の直後に、こちらを追加します。

    // This is required because we are using std::min and std::max, otherwise 
    // we have a collision with min and max macros being defined elsewhere.
    #define NOMINMAX
    

まだビルドできませんが、MainPage (次) を移行した後にビルドできます。

MainPage ビューを移行する

アプリのメイン ページは、アプリを実行したときに最初に表示されるビューを表しています。 これは、画像ライブラリから写真を読み込み、サムネイル ビューを並べて表示するページです。

MainPage ソース コード ファイルをコピーする

  1. DetailPage で行ったことと同様に、MainPage.idlMainPage.xamlMainPage.hMainPage.cpp をコピーします。

  2. .h および .cpp ファイルの名前をそれぞれ .xaml.h および .xaml.cpp に変更します。

  3. 前と同様に、4 つのファイルすべてをターゲット プロジェクトに含めます。

  4. ソリューション エクスプローラーでは、ソース プロジェクト内で MainPage.idlMainPage.xaml の下に入れ子になっています。 その配置が気に入った場合は、\PhotoEditor\PhotoEditor\PhotoEditor\PhotoEditor.vcxproj を手動で編集することにより、ターゲット プロジェクトで同じことを行うことができます。 次の文字列を検索します。

    <Midl Include="MainPage.idl" />
    

    これを、次のコード行に置き換えます。

    <Midl Include="MainPage.idl">
      <DependentUpon>MainPage.xaml</DependentUpon>
    </Midl>
    

MainPage のソース コードを移行する

  1. MainPage.idl で、Windows.UI.Xaml を検索し、両方の出現箇所を Microsoft.UI.Xaml に変更します。

  2. MainPage.xaml.cpp で、#include "MainPage.h"#include "MainPage.xaml.h" に変更します。

  3. そのすぐ下に、#include "MainPage.g.cpp" を追加します。

  4. 引き続き MainPage.xaml.cpp で、静的な App::Window メソッド (これから追加予定) を呼び出してコンパイルする場合、#include "Photo.h" の直前に #include "App.xaml.h" を追加します。

次の手順では、ContentDialog と Popup で説明されている変更を行います。

  1. そのため、引き続き MainPage.xaml.cppMainPage::GetItemsAsync メソッドで、行 ContentDialog unsupportedFilesDialog{}; の直後に、このコード行を追加します。

    unsupportedFilesDialog.XamlRoot(this->Content().XamlRoot());
    
  2. コピーして貼り付けたファイルのソース コードの内容で、次の検索/置換 (大文字と小文字を区別し、完全に一致する単語) を行います。

    • MainPage.xaml.h.xaml.cpp では、Windows::UI::Composition = >Microsoft::UI::Composition
    • MainPage.xaml.h.xaml.cpp では、Windows::UI::Xaml = >Microsoft::UI::Xaml
    • MainPage.xaml.cpp では、Window::Current() =>App::Window()
  3. ソース プロジェクトの pch.h から次の include をコピーして、ターゲット プロジェクトの pch.h に貼り付けます。

    #include <winrt/Microsoft.UI.Xaml.Hosting.h>
    #include <winrt/Microsoft.UI.Xaml.Media.Animation.h>
    #include <winrt/Windows.Storage.Search.h>
    

ターゲット ソリューションをビルドできることを確認します (ただし、まだ実行しないでください)。

MainWindow を更新する

  1. MainWindow.xaml では、MainWindow に UI が必要ないため、StackPanel とその内容を削除します。 これにより、空の Window 要素のみが残ります。

  2. MainWindow.idl で、プレースホルダー Int32 MyProperty; を削除し、コンストラクターのみを残します。

  3. MainWindow.xaml.hMainWindow.xaml.cpp で、プレースホルダー MyPropertymyButton_Click の宣言と定義を削除し、コンストラクターのみを残します。

スレッド モデルの違いに必要な移行の変更

ASTA から STA へのスレッド モデル」で説明されているように、UWP と Windows App SDK のスレッド モデルが異なるため、このセクションで 2 つの変更が必要です。 ここでは、問題の原因の簡単な説明と、それぞれを解決する方法について説明します。

MainPage

MainPage は、Pictures フォルダーから画像ファイルを読み込み、StorageItemContentProperties.GetImagePropertiesAsync を呼び出して画像ファイルのプロパティを取得し、画像ファイルごとに Photo モデル オブジェクトを作成して (同じプロパティをデータ メンバーに保存し)、その Photo オブジェクトをコレクションに追加します。 Photo オブジェクトのコレクションは、UI の GridView にデータ バインドされています。 その GridView に代わって、MainPageContainerContentChanging イベントを処理し、フェーズ 1 では、ハンドラーがコルーチンを呼び出し、それが StorageFile.GetThumbnailAsync を呼び出します。 この GetThumbnailAsync の呼び出しにより、メッセージが生成され (すぐには制御を戻さず、"すべて" の作業が非同期で実行されます)、再入可能になります。 その結果、レイアウトを行っている最中に GridViewItems コレクションが変更され、クラッシュが発生します。

StorageItemContentProperties::GetImagePropertiesAsync の呼び出しをコメントアウトすると、クラッシュは発生しません。 ただし、実際の修正は、StorageFile.GetThumbnailAsync 呼び出しを明示的に非同期にすることです。このためには、GetThumbnailAsync を呼び出す直前に wil::resume_foreground を協調的に待機します。 これが機能するのは、wil::resume_foreground が、それに続くコードを DispatcherQueue のタスクとしてスケジュールするためです。

変更するコードはこちらです。

// MainPage.xaml.cpp
IAsyncAction MainPage::OnContainerContentChanging(ListViewBase sender, ContainerContentChangingEventArgs args)
{
    ...
    if (args.Phase() == 1)
    {
        ...
        try
        {
            co_await wil::resume_foreground(this->DispatcherQueue());
            auto thumbnail = co_await impleType->GetImageThumbnailAsync(this->DispatcherQueue());
            image.Source(thumbnail);
        }
        ...
    }
}

Photo

Photo::ImageTitle プロパティは UI にデータ バインドされているため、その UI は、値が必要なときはいつでも、そのプロパティのアクセサー関数を呼び出します。 ただし、UI スレッドでそのアクセサー関数から ImageProperties.Title にアクセスしようとすると、アクセス違反が発生します。

そのため、代わりに、Photo のコンストラクターからその Title に一度アクセスして、空でない場合は m_imageName データ メンバーに格納できます。 次に、Photo::ImageTitle アクセサー関数で、m_imageName データ メンバーにアクセスするだけです。

変更するコードはこちらです。

// Photo.h
...
Photo(Photo(Windows::Storage::FileProperties::ImageProperties const& props,
    ...
    ) : ...
{
	if (m_imageProperties.Title() != L"")
	{
		m_imageName = m_imageProperties.Title();
	}
}
...
hstring ImageTitle() const
{
	return m_imageName;
}
...

これは、Photo Editor サンプル アプリを移行するために必要な最後の変更です。 「移行されたアプリをテストする」セクションで、手順が正しく実行されたことを確認します。

既知の問題

アプリの種類に関する問題 (Preview 3 にのみ影響)

VSIX for Windows App SDK バージョン 1.0 Preview 3 のプロジェクト テンプレートを使用してこのケース スタディを実行した場合は、PhotoEditor.vcxproj に若干の修正を行う必要があります。 その実行方法を次に示します。

Visual Studio のソリューション エクスプローラーで、プロジェクト ノードを右クリックし、[プロジェクトのアンロード] をクリックします。 これで PhotoEditor.vcxproj を編集できるようになりました。 Project の最初の子として、次のような PropertyGroup 要素を追加します。

<Project ... >
    <PropertyGroup>
        <EnableWin32Codegen>true</EnableWin32Codegen>
    </PropertyGroup>
    <Import ... />
...

PhotoEditor.vcxproj を保存して閉じます。 プロジェクト ノードを右クリックし、[プロジェクトの再読み込み] をクリックします。 次に、プロジェクトをリビルドします。

移行したアプリをテストする

次に、プロジェクトをビルドし、アプリを実行してテストします。 画像を選択して、ズーム レベルを設定し、効果を選択して構成します。

付録:Photo モデルのファイルの内容をコピーする

前述のとおり、ソース コード ファイル自体、またはソース コード ファイルの内容をコピーするオプションがあります。 ソース コード "ファイル" 自体をコピーする方法については、すでに説明しました。 そのため、このセクションでは、ファイルの "内容" をコピーする例を示します。

Visual Studio のソース プロジェクトで、PhotoEditor (ユニバーサル Windows) >Models フォルダーを見つけます。 このフォルダーには、Photo.idlPhoto.hPhoto.cpp が含まれており、これらが合わさって Photo ランタイム クラスを実装します。

IDL を追加してスタブを生成する

Visual Studio のターゲット プロジェクトで、新しい Midl ファイル (.idl) アイテムをプロジェクトに追加します。 新しい項目に Photo.idl.という名前を指定します。 Photo.idl の既定の内容を削除します。

Visual Studio のソース プロジェクトから、Models>Photo.idl の内容をコピーして、ターゲット プロジェクトに追加した Photo.idl ファイルに貼り付けます。 貼り付けたコードで、Windows.UI.Xaml を検索し、それを Microsoft.UI.Xaml に変更します。

ファイルを保存します。

重要

ターゲット ソリューションのビルドを実行しようとしています。 この時点ではビルドを最後まで実行しませんが、必要な作業を行うのに十分なところまで進めます。

次に、ターゲット ソリューションをビルドします。 ビルドは完了しませんが、ここで行う必要があります。Photo モデルの実装を開始するために必要なソース コード ファイル (スタブ) が生成されるためです。

Visual Studio でターゲット プロジェクト ノードを右クリックし、[エクスプローラーでフォルダーを開く] をクリックします。 これにより、エクスプローラーでターゲット プロジェクト フォルダーが開きます。 そこで、Generated Files\sources フォルダーに移動します (\PhotoEditor\PhotoEditor\PhotoEditor\Generated Files\sources に移動することになります)。 スタブ ファイル Photo.h.cpp をコピーして、プロジェクト フォルダー (\PhotoEditor\PhotoEditor\PhotoEditor 内で 2 つ上のフォルダー レベル) に貼り付けます。

ソリューション エクスプローラーに戻り、ターゲット プロジェクト ノードを選択して、[すべてのファイルを表示] がオンになっていることを確認します。 貼り付けたスタブ ファイル (Photo.h および .cpp) を右クリックし、[プロジェクトに含める] をクリックします。 [すべてのファイルを表示] をオフに切り替えます。

Photo.h.cpp の内容の上部に static_assert が表示されますが、これは削除する必要があります。

ビルドできることをもう一度確認します (ただし、まだ実行しないでください)。

コードをスタブに移行する

ソース プロジェクトの Photo.h および .cpp の内容をターゲット プロジェクトにコピーします。

ここからは、コピーしたコードを移行するための残りの手順は、「Photo ソース コードを移行する」セクションに記載されている手順と同じです。