Partilhar via


Uma migração do SDK de Aplicações do Windows do aplicativo de exemplo de Editor de Fotos UWP (C++/WinRT)

Este tópico é um estudo de caso sobre como pegar o aplicativo de exemplo C++/WinRT UWP Photo Editore migrá-lo para o SDK de Aplicativo do Windows.

Importante

Para obter considerações e estratégias para abordar o processo de migração e como configurar seu ambiente de desenvolvimento para migração, consulte Estratégia geral de migração.

Instalar ferramentas para o SDK de Aplicativos Windows

Para configurar o computador de desenvolvimento, consulte Ferramentas de instalação para o SDK de aplicativos do Windows.

Importante

Você encontrará tópicos de notas de versão juntamente com o tópico canais de lançamento do SDK do Aplicativo Windows. Existem notas de versão para cada canal. Certifique-se de verificar quaisquer limitações de e problemas conhecidos nessas notas de versão, pois eles podem afetar os resultados de acompanhar este estudo de caso e/ou executar o aplicativo migrado.

Criar um novo projeto

  • No Visual Studio, crie um novo projeto C++/WinRT a partir do Aplicação em Branco, Empacotado (WinUI 3 na área de trabalho) modelo de projeto. Nomeie o projeto PhotoEditore desmarque a opção Colocar solução e projeto no mesmo diretório. Você pode direcionar a versão mais recente (não a visualização) do sistema operacional cliente.

Observação

Referir-nos-emos à versão UWP do projeto de exemplo (aquele que clonou do seu repositório ) como a solução/projeto fonte . Iremos referir-nos à versão do SDK da Aplicação Windows como a solução/projeto alvo .

A ordem em que migraremos o código

MainPage é uma parte importante e proeminente do aplicativo. Mas se começássemos por migrar isso, logo perceberíamos que MainPage tem uma dependência sobre a vista DetailPage; e então que DetailPage tem uma dependência sobre o modelo Photo. Então, para este passo a passo, vamos adotar esta abordagem.

  • Começaremos copiando os arquivos de ativos.
  • Em seguida, migraremos o modelo Photo.
  • Em seguida, migraremos a classe App (porque é necessário adicionar-lhe alguns membros dos quais DetailPage e MainPage dependerão).
  • Em seguida, começaremos a migrar as visualizações, começando com DetailPage primeiro.
  • Concluiremos migrando a vista MainPage.

Copiaremos arquivos de código-fonte inteiros

Neste passo a passo, copiaremos os arquivos de código-fonte usando Explorador de Arquivos. Se preferir copiar o conteúdo do de arquivo mais, consulte a seção Apêndice : copiando o conteúdo dos arquivos do modelo Photo no final deste tópico para obter um exemplo de como você pode fazer isso para de fotos (e você pode aplicar um procedimento semelhante a outros tipos no projeto). No entanto, essa opção envolve muito mais etapas.

Copiar arquivos de ativos

  1. No clone do projeto de origem, no Explorador de Arquivos , localize a pasta Windows-appsample-photo-editor>PhotoEditor>Assets. Você encontrará oito arquivos de ativos nessa pasta. Selecione esses oito ficheiros e copie-os para a área de transferência.

  2. Também no Explorador de Arquivos, agora localize a pasta correspondente no projeto de destino que você criou. O caminho para essa pasta é PhotoEditor>PhotoEditor>Assets. Cole no diretório os ficheiros que acabou de copiar, e aceite o aviso para substituir os sete ficheiros que já existem no diretório de destino.

  3. No seu projeto de destino no Visual Studio, no Gerenciador de Soluções, expanda a pasta Assets. Adicione a essa pasta o ficheiro de ativo bg1.png existente que acabou de colar. Você pode passar o ponteiro do mouse sobre os arquivos de ativos. Uma visualização em miniatura aparecerá para cada um, confirmando que você substituiu/adicionou os arquivos de ativos corretamente.

Migrar o modelo de foto

Photo é uma classe de tempo de execução que representa uma foto. É um modelo (no sentido de modelos, visualizações e viewmodels).

Copiar arquivos de código-fonte da foto

  1. No seu clone do projeto de origem, no Explorador de Arquivos, localize a pasta Windows-appsample-photo-editor>PhotoEditor. Nessa pasta, você encontrará os três arquivos de código-fonte Photo.idl, Photo.he Photo.cpp; esses arquivos juntos implementam a classe de tempo de execução do Photo. Selecione esses três ficheiros e copie-os para a área de transferência.

  2. No Visual Studio, clique com o botão direito do mouse no nó do projeto de destino e clique em Abrir Pasta no Explorador de Arquivos. Isso abre a pasta do projeto de destino no Explorador de Arquivos . Cole nessa pasta os três arquivos que você acabou de copiar.

  3. De volta ao Explorador de Soluções, com o nó do projeto de destino selecionado, certifique-se de que Mostrar Todos os Arquivos esteja ligado. Clique com o botão direito do rato nos três ficheiros que acabou de colar e clique Incluir no Projeto. Alterne Mostrar todos os arquivos desativado.

  4. No projeto de origem, no Gerenciador de Soluções , Photo.h e .cpp são aninhados sob Photo.idl para indicar que são gerados a partir dele e dependem dele. Se você gosta dessa organização, então você pode fazer a mesma coisa no projeto de destino editando manualmente \PhotoEditor\PhotoEditor\PhotoEditor\PhotoEditor.vcxproj (você primeiro precisará Salvar todos os no Visual Studio). Encontre o seguinte:

    <ClInclude Include="Photo.h" />
    

    E substitua-o por este:

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

    Repita isso por Photo.cppe salve e feche o arquivo de projeto. Quando retomares o foco no Visual Studio, clica em Recarregar.

Migrar código-fonte da foto

  1. No Photo.idl, procure o nome do namespace Windows.UI.Xaml (que é o namespace para UWP XAML) e altere-o para Microsoft.UI.Xaml (que é o namespace para WinUI XAML).

Observação

O tópico Mapeando APIs UWP para o SDK de Aplicativo Windows fornece um mapeamento de APIs UWP para seus equivalentes do SDK de Aplicativo Windows. A alteração que fizemos acima é um exemplo de uma alteração de nome de namespace necessária durante o processo de migração.

  1. Em Photo.cpp, adicionar #include "Photo.g.cpp" às diretivas de inclusão existentes, imediatamente após #include "Photo.h". Esta é uma das diferenças importantes de nome de pasta e ficheiro (C++/WinRT) que devem ser observadas entre projetos UWP e SDK de Aplicações do Windows.

  2. Faça a seguinte operação de encontrar/substituir (distinção entre maiúsculas e minúsculas e correspondência de palavra completa) no conteúdo de todo o código-fonte nos ficheiros que acabou de copiar e colar.

    • Windows::UI::Xaml =>Microsoft::UI::Xaml
  3. De pch.h no projeto de origem, copie as seguintes inclusões e cole-as em pch.h no projeto de destino. Este é um subconjunto dos arquivos de cabeçalho incluídos no projeto de origem; Estes são apenas os cabeçalhos que precisamos para suportar o código que migramos até agora.

    #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. Agora confirme que consegue compilar a solução alvo (mas ainda não execute).

Migrar a classe App

Não são necessárias alterações ao App.idl e App.xamldo projeto-alvo. Mas precisamos editar App.xaml.h e App.xaml.cpp para adicionar alguns novos membros à classe App. Faremos isso de uma forma que nos permita construir após cada seção (com exceção da última seção, que é sobre App::OnLaunched).

Disponibilizando o objeto da janela principal

Nesta etapa, faremos a alteração explicada em Alterar Windows.UI.Xaml.Window.Current para App.Window.

No projeto de destino, App armazena o objeto da janela principal em seu membro de dados privado janela. Mais tarde no processo de migração (quando migramos o uso do Window.Current pelo projeto de origem), será conveniente se essa janela membro de dados for estática; e também é disponibilizado através de uma função de acessor. Então, faremos essas alterações a seguir.

  • Como vamos tornar a janela estática, precisaremos inicializá-la em App.xaml.cpp em vez de usar o inicializador de membro padrão que o código está a utilizar atualmente. Veja como são essas mudanças em App.xaml.h e App.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

A aplicação de exemplo Photo Editor utiliza lógica de navegação para alternar entre MainPage e DetailPage. Para saber mais sobre os aplicativos do SDK do Aplicativo Windows que precisam de navegação (e os que não precisam), veja Preciso implementar a navegação na página?.

Assim, os membros que migraremos nas próximas seções existem todos para suportar a navegação dentro do aplicativo.

  1. Vamos começar por migrar o manipulador de eventos OnNavigationFailed. Copie a declaração e a definição dessa função de membro do projeto de origem e cole-a no projeto de destino (em App.xaml.h e App.xaml.cpp).

  2. No código colado no App.xaml.h, altere Windows::UI::Xaml para Microsoft::UI::Xaml.

Aplicativo::CreateRootFrame

  1. O projeto de origem contém uma função auxiliar chamada App::CreateRootFrame. Copie a declaração e a definição dessa função auxiliar do projeto de origem e cole-a no projeto de destino (em App.xaml.h e App.xaml.cpp).

  2. No código que colou em App.xaml.h, altere Windows::UI::Xaml para Microsoft::UI::Xaml.

  3. No código que você colou no App.xaml.cpp, altere as duas ocorrências de Window::Current() para window (que é o nome do membro de dados da classe do App que vimos anteriormente).

App::OnLaunched

O projeto de destino já contém uma implementação do manipulador de eventos OnLaunched. O seu parâmetro é uma referência constante a um Microsoft::UI::Xaml::LaunchActivatedEventArgs, que é correto para o SDK de aplicações Windows (em contraste com o projeto original, que usa Windows::ApplicationModel::Activation::LaunchActivatedEventArgs, que é correto para UWP).

  • Só precisamos fundir as duas definições (origem e destino) de OnLaunched para que App::OnLaunched no projeto de destino App.xaml.cpp se pareça com a listagem abaixo. Observe que ele usa window (em vez de Window::Current(), como faz a versão UWP).

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

O código acima dá a App uma dependência de MainPage, portanto, não poderemos criar a partir deste ponto até que tenhamos migrado DetailPage e, em seguida, MainPage. Quando formos capazes de construir novamente, diremos isso.

Migrar a vista DetailPage

DetailPage é a classe que representa a página do editor de fotos, onde os efeitos Win2D são alternados, definidos e encadeados. Você chega à página do editor de fotos selecionando uma miniatura de foto na página principal . DetailPage é uma vista (no sentido de modelos, vistas e viewmodels).

Fazer referência ao pacote Win2D NuGet

Para oferecer suporte ao código em DetailPage, o projeto de origem depende de Microsoft.Graphics.Win2D. Portanto, também precisaremos de uma dependência do Win2D em nosso projeto alvo.

  • Na solução de destino no Visual Studio, clique em Ferramentas >Gestor de Pacotes NuGet>Gerir Pacotes NuGet para Solução...>Explorar. Verifique se a opção Incluir pré-lançamento está desmarcada e digite ou cole Microsoft.Graphics.Win2D na caixa de pesquisa. Selecione o item correto nos resultados da pesquisa, verifique o projeto PhotoEditor e clique em Instalar para instalar o pacote.

Copiar arquivos de código-fonte DetailPage

  1. No seu clone do projeto de origem, no Explorador de Arquivos, localize a pasta Windows-appsample-photo-editor>PhotoEditor. Nessa pasta você encontrará os quatro arquivos de código-fonte DetailPage.idl, DetailPage.xaml, DetailPage.he DetailPage.cpp; esses arquivos juntos implementam o DetailPage exibição. Selecione esses quatro ficheiros e copie-os para a prancha.

  2. No Visual Studio, clique com o botão direito do mouse no nó do projeto de destino e clique em Abrir Pasta no Explorador de Arquivos. Isso abre a pasta do projeto de destino no Explorador de Arquivos . Cole nessa pasta os quatro arquivos que você acabou de copiar.

  3. Em Explorador de Ficheiros, altere os nomes de DetailPage.h e DetailPage.cpp para DetailPage.xaml.h e DetailPage.xaml.cpp, respetivamente. Esta é uma das diferenças de nome de pasta e arquivo (C++/WinRT) deve ser observada entre projetos UWP e SDK de aplicativos Windows.

  4. De volta ao Explorador de Soluções, com o nó do projeto de destino selecionado, certifique-se de que Mostrar Todos os Arquivos está ligado. Clique com o botão direito do rato nos quatro ficheiros que acabou de colar (e renomear) e clique Incluir no Projeto. Desative Mostrar todos os arquivos.

  5. No projeto de origem, no Explorador de Soluções , DetailPage.idl está inserido sob DetailPage.xaml. Se gostas dessa disposição, então podes fazer o mesmo no projeto de destino editando manualmente \PhotoEditor\PhotoEditor\PhotoEditor\PhotoEditor.vcxproj (primeiro precisarás Guardar tudo no Visual Studio). Encontre o seguinte:

    <Midl Include="DetailPage.idl" />
    

    E substitua-o por este:

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

Salve e feche o arquivo de projeto. Quando você definir o foco de volta para Visual Studio, clique em Recarregar.

Migrar código-fonte do DetailPage

  1. No DetailPage.idl, procure por Windows.UI.Xamle altere-o para Microsoft.UI.Xaml.

  2. Em DetailPage.xaml.cpp, altere #include "DetailPage.h" para #include "DetailPage.xaml.h".

  3. Imediatamente abaixo disso, adicione #include "DetailPage.g.cpp".

  4. Para que a chamada ao método estático App::Window (que estamos prestes a adicionar) compile, ainda em DetailPage.xaml.cpp, adicione #include "App.xaml.h" imediatamente antes de #include "Photo.h".

  5. Faça a seguinte operação de procurar/substituir (respeitando maiúsculas e minúsculas e palavra inteira) no conteúdo do código-fonte nos ficheiros que acabou de copiar e colar.

    • Em DetailPage.xaml.h e .xaml.cpp, Windows::UI::Composition =>Microsoft::UI::Composition
    • Em DetailPage.xaml.h e .xaml.cpp, Windows::UI::Xaml =>Microsoft::UI::Xaml
    • Em DetailPage.xaml.cpp, Window::Current() =>App::Window()
  6. De pch.h no projeto de origem, copie as inclusões seguintes e cole-as em pch.h no projeto de destino.

    #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. Além disso, na parte superior do pch.h, imediatamente após #pragma once, adicione o seguinte:

    // 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
    

Ainda não podemos construir, mas poderemos depois de migrar MainPage (que é a próxima etapa).

Migrar a vista MainPage

A página principal do aplicativo representa a exibição que você vê primeiro quando executa o aplicativo. É a página que carrega as fotos da Biblioteca de Imagens do e exibe uma vista em miniatura em mosaico.

Copiar arquivos de código-fonte do MainPage

  1. Semelhante ao que fizeste com DetailPage, agora copia MainPage.idl, MainPage.xaml, MainPage.he MainPage.cpp.

  2. Renomeie os arquivos .h e .cpp para .xaml.h e .xaml.cpp, respectivamente.

  3. Inclua todos os quatro arquivos no projeto de destino como antes.

  4. No projeto de origem, no Explorador de Soluções , MainPage.idl está aninhado em MainPage.xaml. Se você gosta desse arranjo, então você pode fazer a mesma coisa no projeto de destino editando manualmente \PhotoEditor\PhotoEditor\PhotoEditor\PhotoEditor.vcxproj. Encontre o seguinte:

    <Midl Include="MainPage.idl" />
    

    E substitua-o por:

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

Migrar código-fonte da MainPage

  1. Em MainPage.idl, procure Windows.UI.Xamle altere ambas as ocorrências para Microsoft.UI.Xaml.

  2. Em MainPage.xaml.cpp, altere #include "MainPage.h" para #include "MainPage.xaml.h".

  3. Imediatamente abaixo disso, adicione #include "MainPage.g.cpp".

  4. Para a chamada para a estática App::Window método (que estamos prestes a adicionar) para compilar, ainda em MainPage.xaml.cpp, adicione #include "App.xaml.h" imediatamente antes #include "Photo.h".

Para a próxima etapa, faremos a alteração explicada em ContentDialog e Popup.

  1. Assim, ainda em MainPage.xaml.cpp, no método MainPage::GetItemsAsync, imediatamente após a linha ContentDialog unsupportedFilesDialog{};, adicione esta linha de código.

    unsupportedFilesDialog.XamlRoot(this->Content().XamlRoot());
    
  2. Faça a seguinte localização/substituições (correspondência de maiúsculas e minúsculas e palavra inteira) no conteúdo do código-fonte nos arquivos que você acabou de copiar e colar.

    • Em MainPage.xaml.h e .xaml.cpp, Windows::UI::Composition =>Microsoft::UI::Composition
    • Em MainPage.xaml.h e .xaml.cpp, Windows::UI::Xaml =>Microsoft::UI::Xaml
    • Em MainPage.xaml.cpp, Window::Current() =>App::Window()
  3. De pch.h no projeto de origem, copie as seguintes inclusões e cole-as em pch.h no projeto de destino.

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

Confirme que consegue criar a solução de destino (mas ainda não execute).

Atualizar MainWindow

  1. Em MainWindow.xaml, exclua o StackPanel e seu conteúdo, já que não precisamos de nenhuma interface do usuário em MainWindow. Isso deixa apenas o elemento Window vazio.

  2. No MainWindow.idl, elimine o marcador de posição Int32 MyProperty;, deixando apenas o construtor.

  3. Em MainWindow.xaml.h e MainWindow.xaml.cpp, exclua as declarações e definições do espaço reservado MyProperty e myButton_Click, deixando apenas o construtor.

Alterações de migração necessárias para as diferenças no modelo de threads

As duas alterações nesta seção são necessárias devido a uma diferença de modelo de threading entre UWP e o SDK de Aplicativo do Windows, conforme descrito em modelo de threading ASTA para STA. Aqui estão breves descrições das causas dos problemas e, em seguida, uma maneira de resolver cada um.

Página Principal

MainPage carrega arquivos de imagem da pasta Imagens, chama StorageItemContentProperties.GetImagePropertiesAsync para obter as propriedades do arquivo de imagem, cria um objeto de modelo 'Photo' para cada arquivo de imagem (salvando essas mesmas propriedades em um membro de dados) e adiciona esse objeto 'Photo' a uma coleção. A coleção de objetos Photo é vinculada a dados a um GridView na interface do usuário. Em nome desse GridView, a MainPage lida com o evento ContainerContentChanging e, para a fase 1, esse manipulador invoca uma rotina assíncrona que chama StorageFile.GetThumbnailAsync. Essa chamada para GetThumbnailAsync resulta em mensagens sendo bombeadas (ele não retorna imediatamente e todas as de seu trabalho assíncrono), e isso causa reentrância. O resultado é que o GridView tem sua coleção Items alterada enquanto o layout está ocorrendo, e isso causa uma falha.

Se desativarmos temporariamente a chamada para StorageItemContentProperties::GetImagePropertiesAsync, então não ocorre a falha. Mas a verdadeira correção é tornar a chamada para StorageFile.GetThumbnailAsync explicitamente assíncrona, aguardando cooperativamente por wil::resume_foreground imediatamente antes de executar a chamada para GetThumbnailAsync. Isso funciona porque wil::resume_foreground agenda que o código seguinte seja uma tarefa na DispatcherQueue.

Aqui está o código a ser alterado:

// 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);
        }
        ...
    }
}

Fotografia

A propriedade Photo::ImageTitle é vinculada a dados à interface do usuário, portanto, a interface do usuário chama a função de acessador para essa propriedade sempre que precisar de seu valor. Mas quando tentamos acessar ImageProperties.Title a partir dessa função de acessador no thread da interface do usuário, recebemos uma violação de acesso.

Então, em vez disso, podemos apenas aceder a esse Title uma só vez, a partir do construtor de Photo, e armazená-lo no membro de dados m_imageName se não estiver vazio. Então, na função acessora Photo::ImageTitle, precisamos apenas acessar o atributo m_imageName.

Aqui está o código a ser alterado:

// 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;
}
...

Essas são as últimas alterações que precisamos fazer para migrar o Photo Editor aplicativo de exemplo. Na seção Testar o aplicativo migrado confirmaremos que seguimos corretamente as etapas.

Problemas conhecidos

Problema de tipo de aplicativo (afeta apenas a visualização 3)

Se você acompanhou este estudo de caso usando o modelo de projeto do VSIX for Windows App SDK versão 1.0 Preview 3, então você precisará fazer uma pequena correção para PhotoEditor.vcxproj. Veja como fazer isso.

No Visual Studio, em Explorador de Soluções, clique com o botão direito do mouse no nó do projeto e clique em Descarregar Projeto. Agora PhotoEditor.vcxproj está aberto para edição. Como o primeiro filho de Project, adicione um elemento PropertyGroup como este:

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

Salve e feche PhotoEditor.vcxproj. Clique com o botão direito do mouse no nó do projeto e clique em Recarregar Projeto. Agora reconstrua o projeto.

Testar o aplicativo migrado

Agora crie o projeto e execute o aplicativo para testá-lo. Selecione uma imagem, defina um nível de zoom, escolha efeitos e configure-os.

Apêndice: copiar o conteúdo dos arquivos do modelo Photo

Como discutimos anteriormente, tem a opção de copiar os próprios arquivos de código-fonte , ou o conteúdo dos arquivos de código-fonte. Já mostramos como copiar os próprios arquivos de código-fonte . Portanto, esta seção dá um exemplo de cópia do conteúdo do arquivo para.

No projeto de origem no Visual Studio, localize a pasta PhotoEditor (Universal Windows)>Models. Essa pasta contém os arquivos Photo.idl, Photo.he Photo.cpp, que juntos implementam a classe de tempo de execução Photo.

Adicione o IDL e gere stubs

Em seu projeto de destino no Visual Studio, adicione um novo Midl File (.idl) item ao projeto. Nomeie o novo item Photo.idl. Exclua o conteúdo padrão do Photo.idl.

Do projeto de origem no Visual Studio, copie o conteúdo de Models>Photo.idle cole-os no arquivo de Photo.idl que você acabou de adicionar ao seu projeto de destino. No código que colou, procure Windows.UI.Xamle altere-o para Microsoft.UI.Xaml.

Salve o arquivo.

Importante

Estamos prestes a efetuar uma construção da sua solução de destino. A construção não será concluída neste momento, mas chegará longe o suficiente para fazer o trabalho necessário para nós.

Agora construa a solução de destino. Mesmo que não seja concluída, a construção é necessária agora porque gerará os arquivos de código-fonte (stubs) de que precisamos para começar a implementar o modelo Photo.

No Visual Studio, clique com o botão direito do mouse no nó do projeto de destino e clique em Abrir Pasta no Explorador de Arquivos. Isso abre a pasta do projeto de destino no Explorador de Arquivos . Lá, navega até à pasta Generated Files\sources (ficarás na \PhotoEditor\PhotoEditor\PhotoEditor\Generated Files\sources). Copie os ficheiros de stub Photo.h e .cppe cole-os na pasta do projeto, que agora está dois níveis acima na hierarquia, em \PhotoEditor\PhotoEditor\PhotoEditor.

De volta Gerenciador de Soluções, com o nó do projeto de destino selecionado, verifique se Mostrar Todos os Arquivos está ativado. Clique com o botão direito do rato nos ficheiros de stub que acabou de colar (Photo.h e .cpp) e clique em Incluir no Projeto. Alterne Mostrar todos os arquivos desativado.

Você verá um static_assert na parte superior do conteúdo do Photo.h e .cpp, que você precisará excluir.

Confirme que podes compilar novamente (mas ainda não executar).

Migrar código nos "stubs"

Copie o conteúdo de Photo.h e .cpp do projeto de origem para o projeto de destino.

A partir daqui, as etapas restantes para migrar o código que copiou são as mesmas fornecidas na seção Migrar Foto código-fonte.