Compartilhar via


Como atualizar um aplicativo da área de trabalho do WPF para o .NET 8

Este artigo descreve como atualizar um aplicativo da área de trabalho do WPF (Windows Presentation Foundation) para o .NET 8. Embora o WPF seja executado no .NET, uma tecnologia multiplataforma, o WPF ainda é uma estrutura somente do Windows. Os seguintes tipos de projeto relacionados ao WPF podem ser atualizados com o Assistente de Atualização do .NET:

  • Projeto do WPF
  • Biblioteca de controle
  • Biblioteca .NET

Se você estiver atualizando do .NET Framework para o .NET, considere revisar o artigo Diferenças do WPF com o .NET e o guia Migrando do .NET Framework para o .NET.

Pré-requisitos

Aplicação de demonstração

Este artigo foi escrito no contexto da atualização do projeto de Exemplo de Favoritos da Web , que você pode baixar no repositório GitHub de exemplos do .NET.

Iniciar a atualização

Se você estiver atualizando vários projetos, comece com projetos que não tenham dependências. No exemplo de Favoritos da Web, o projeto WebSiteRatings depende da biblioteca StarVoteControl , portanto, StarVoteControl deve ser atualizado primeiro.

Dica

Certifique-se de ter um backup do seu código, como no controle do código-fonte ou em uma cópia.

Use as seguintes etapas para atualizar um projeto no Visual Studio:

  1. Clique com o botão direito do mouse no projeto StarVoteControl na janela do Gerenciador de Soluções e selecione Atualizar:

    O item Atualização no menu do Assistente de Atualização do .NET no Visual Studio.

    Uma nova guia é aberta e solicita que você escolha como deseja que a atualização seja executada.

  2. Selecione Atualização de projeto no local.

  3. Em seguida, selecione a estrutura de destino. Com base no tipo de projeto que você está atualizando, opções diferentes são apresentadas. O .NET Standard 2.0 será uma boa opção se a biblioteca não depender de uma tecnologia de área de trabalho como o WPF e puder ser usada por projetos do .NET Framework e projetos do .NET. No entanto, as versões mais recentes do .NET fornecem muitos aprimoramentos de idioma e compilador em relação ao .NET Standard.

    Selecione .NET 8.0 e selecione Avançar.

  4. Uma árvore é mostrada com todos os artefatos relacionados ao projeto, como arquivos de código e bibliotecas. É possível atualizar artefatos individuais ou o projeto inteiro, que é o padrão. Selecione Seleção de atualização para iniciar a atualização.

    Quando a atualização for concluída, os resultados serão exibidos:

    A guia de resultados de atualização do Assistente de Atualização do .NET, mostrando que 7 dos 21 itens foram ignorados.

    Artefatos com um círculo verde sólido foram atualizados, enquanto círculos verdes vazios foram ignorados. Artefatos ignorados significam que o assistente de atualização não encontrou nada para atualizar.

Agora que a biblioteca de suporte do aplicativo foi atualizada, atualize o aplicativo principal.

Atualizar o aplicativo

Depois que todas as bibliotecas de suporte forem atualizadas, o projeto do aplicativo principal poderá ser atualizado. Execute as seguintes etapas:

  1. Clique com o botão direito do mouse no projeto WebSiteRatings na janela do Gerenciador de Soluções e selecione Atualizar:
  2. Selecione atualização de projeto in-place como o modo de atualização.
  3. Selecione .NET 8.0 para a estrutura de destino e selecione Avançar.
  4. Deixe todos os artefatos selecionados e selecione Atualizar seleção.

Após a conclusão da atualização, os resultados são mostrados. Se um item tiver um símbolo de aviso, isso significa que há uma anotação para você ler, o que você pode fazer expandindo o item.

Gerar uma compilação limpa

Depois que o projeto for atualizado, limpe-o e compile-o.

  1. Clique com o botão direito do mouse no projeto WebSiteRatings na janela do Gerenciador de Soluções e selecione Limpar.
  2. Clique com o botão direito do mouse no projeto WebSiteRatings na janela do Gerenciador de Soluções e selecione Compilar.

Se o aplicativo encontrou erros, você pode encontrá-los na janela Lista de Erros com uma recomendação de como corrigi-los.

Etapas de pós-atualização

Se o projeto estiver sendo atualizado do .NET Framework para o .NET, examine as informações no Modernizar após a atualização para o .NET do .NET Framework artigo.

Depois de atualizar, você desejará:

  • Verifique seus pacotes NuGet.

    O .NET Upgrade Assistant atualizou alguns pacotes para novas versões. Com o aplicativo de exemplo fornecido neste artigo, o Microsoft.Data.Sqlite pacote NuGet foi atualizado de 1.0.0 para 8.0.x. No entanto, 1.0.0 depende do SQLite pacote NuGet, mas 8.0.x remove essa dependência. O SQLite pacote NuGet ainda é referenciado pelo projeto, embora não seja mais necessário. Tanto o pacote NuGet SQLite quanto o SQLite.Native podem ser removidos do projeto.

  • Limpe os pacotes NuGet antigos.

    O arquivo packages.config não é mais necessário e pode ser excluído do projeto, pois as referências do pacote NuGet agora são declaradas no arquivo de projeto. Além disso, a pasta de cache do pacote NuGet local, chamada Pacotes, está na pasta ou na pasta pai do projeto. Essa pasta de cache local pode ser excluída. As novas referências de pacote NuGet usam uma pasta de cache global para pacotes, disponível no diretório de perfil do usuário, chamado .nuget\packages.

  • Remova a System.Configuration biblioteca.

    A maioria dos aplicativos do .NET Framework faz referência à System.Configuration biblioteca. Após a atualização, é possível que essa biblioteca ainda seja referenciada diretamente.

    A System.Configuration biblioteca usa o arquivo app.config para fornecer opções de configuração em tempo de execução para seu aplicativo. Para .NET, essa biblioteca foi substituída pelo System.Configuration.ConfigurationManager pacote NuGet. Remova a referência à biblioteca e adicione o pacote NuGet ao seu projeto.

  • Verifique se há lugares para modernizar seu aplicativo.

    AS APIs e bibliotecas mudaram bastante desde que o .NET foi lançado. E, na maioria dos casos, o .NET Framework não tem acesso a essas melhorias. Ao atualizar para o .NET, agora você tem acesso a bibliotecas mais modernas.

    As próximas seções descrevem as áreas em que você pode modernizar o aplicativo de exemplo utilizado neste artigo.

Modernizar: controle do navegador da Web

O WebBrowser controle referenciado pelo aplicativo de exemplo do WPF é baseado no Internet Explorer, que está desatualizado. O WPF para .NET pode usar o controle WebView2 com base no Microsoft Edge. Conclua as seguintes etapas para atualizar para o novo WebView2 controle do navegador da Web:

  1. Adicione o pacote NuGet Microsoft.Web.WebView2.

  2. No arquivo MainWindow.xaml :

    1. Importe o controle para o namespace wpfControls no elemento raiz:

      <mah:MetroWindow x:Class="WebSiteRatings.MainWindow"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
              xmlns:mah="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
              xmlns:local="clr-namespace:WebSiteRatings"
              xmlns:vm="clr-namespace:WebSiteRatings.ViewModels"
              xmlns:VoteControl="clr-namespace:StarVoteControl;assembly=StarVoteControl"
              xmlns:wpfControls="clr-namespace:Microsoft.Web.WebView2.Wpf;assembly=Microsoft.Web.WebView2.Wpf"
              Loaded="MetroWindow_Loaded"
              mc:Ignorable="d"
              Title="My Sites" Height="650" Width="1000">
      
    2. No local em que o <Border> elemento é declarado, remova o WebBrowser controle e substitua-o pelo wpfControls:WebView2 controle:

      <Border Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="2" BorderThickness="1" BorderBrush="Black" Margin="5">
          <wpfControls:WebView2 x:Name="browser" ScrollViewer.CanContentScroll="True" />
      </Border>
      
  3. Edite o arquivo de código associado MainWindow.xaml.cs. Atualize o método ListBox_SelectionChanged para definir a propriedade browser.Source para um Uri válido. Esse código passou anteriormente na URL do site como uma cadeia de caracteres, mas o WebView2 controle requer um Uri.

    private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        var siteCollection = (ViewModels.SiteCollection)DataContext;
    
        if (siteCollection.SelectedSite != null)
            browser.Source = new Uri(siteCollection.SelectedSite.Url);
        else
            browser.NavigateToString("<body></body>");
    }
    

Dependendo de qual versão do Windows um usuário do seu aplicativo está em execução, talvez seja necessário instalar o runtime do WebView2. Para obter mais informações, consulte Introdução ao WebView2 em aplicativos WPF.

Modernizar: appsettings.json

O .NET Framework usa o arquivo App.config para carregar configurações para seu aplicativo, como cadeias de conexão e provedores de log. O .NET agora usa o arquivo appsettings.json para configurações de aplicativo. App.config arquivos são suportados no .NET através do System.Configuration.ConfigurationManager pacote NuGet, e o suporte para appsettings.json é oferecido através do Microsoft.Extensions.Configuration pacote NuGet.

À medida que outras bibliotecas são atualizadas para o .NET, elas são modernizadas com suporte appsettings.json em vez de App.config. Por exemplo, os provedores de log no .NET Framework que foram atualizados para .NET 6+ não usam mais App.config para configurações. É bom seguir a direção deles e também deixar de usar App.config onde puder.

Use o appsettings.json com o aplicativo de exemplo do WPF

Por exemplo, depois de atualizar o aplicativo de exemplo do WPF, use appsettings.json para a string de conexão com o banco de dados local.

  1. Remova o System.Configuration.ConfigurationManager pacote NuGet.

  2. Adicione o pacote NuGet Microsoft.Extensions.Configuration.Json.

  3. Adicione um arquivo ao projeto chamado appsettings.json.

  4. Defina o arquivo appsettings.json para copiar para o diretório de saída.

    Defina a configuração copiar para saída no Visual Studio usando a janela Propriedades, depois de selecionar o arquivo no Gerenciador de Soluções. Como alternativa, você pode editar o projeto diretamente e adicionar o seguinte ItemGroup:

      <ItemGroup>
        <Content Include="appsettings.json">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </Content>
      </ItemGroup>
    
  5. Migre as configurações no arquivo App.config para um novo arquivo deappsettings.json .

    No aplicativo de exemplo do WPF, app.config continha apenas uma única cadeia de conexão. Edite o arquivo appsettings.json para definir a cadeia de conexão:

    {
      "ConnectionStrings": {
        "database": "DataSource=sqlite.db;"
      }
    }
    
  6. Edite o arquivo App.xaml.cs , instanciando um objeto de configuração que carrega o arquivo appsettings.json , as linhas adicionadas são realçadas:

    using System.Windows;
    using Microsoft.Extensions.Configuration;
    
    namespace WebSiteRatings
    {
        /// <summary>
        /// Interaction logic for App.xaml
        /// </summary>
        public partial class App : Application
        {
            public static IConfiguration Config { get; private set; }
    
            public App()
            {
                Config = new ConfigurationBuilder()
                    .AddJsonFile("appsettings.json")
                    .Build();
            }
        }
    }
    
  7. No arquivo .\Models\Database.cs , altere o OpenConnection método para usar a nova App.Config propriedade. Isso requer a importação do Microsoft.Extensions.Configuration namespace:

    using Microsoft.Data.Sqlite;
    using System.Collections.Generic;
    using Microsoft.Extensions.Configuration;
    
    namespace WebSiteRatings.Models
    {
        internal class Database
        {
            public static SqliteConnection OpenConnection() =>
                new SqliteConnection(App.Config.GetConnectionString("database"));
    
            public static IEnumerable<Site> ReadSites()
    

    GetConnectionString é um método de extensão fornecido pelo Microsoft.Extensions.Configuration namespace.