Condividi tramite


Come aggiornare un'app desktop WPF a .NET 8

Questo articolo descrive come aggiornare un'app desktop Windows Presentation Foundation (WPF) a .NET 8. Anche se WPF viene eseguito in .NET, una tecnologia multipiattaforma, WPF è ancora un framework solo Windows. È possibile aggiornare i tipi di progetto correlati a WPF seguenti con .NET Upgrade Assistant:

  • Progetto WPF
  • Libreria di controlli
  • Libreria .NET

Se si esegue l'aggiornamento da .NET Framework a .NET, vedere l'articolo differenze con WPF .NET e la guida alla conversione da .NET Framework a .NET.

Prerequisiti

Applicazione demo

Questo articolo è stato scritto nel contesto dell'aggiornamento del progetto di esempio Preferiti Web, che è possibile scaricare dal repository GitHub degli esempi .NET .

Avviare l'aggiornamento

Se si aggiornano più progetti, iniziare con i progetti che non hanno dipendenze. Nell'esempio Web Preferiti, il progetto WebSiteRatings dipende dalla libreria StarVoteControl , quindi StarVoteControl deve essere aggiornato per primo.

Suggerimento

Assicurarsi di disporre di un backup del codice, ad esempio nel controllo del codice sorgente o in una copia.

Usare la procedura seguente per aggiornare un progetto in Visual Studio:

  1. Fare clic con il pulsante destro del mouse sul progetto StarVoteControl nella finestra Esplora soluzioni e selezionare Aggiorna:

    la voce di menu Aggiorna dell'Upgrade Assistant di .NET in Visual Studio.

    Viene aperta una nuova scheda che richiede di scegliere la modalità di esecuzione dell'aggiornamento.

  2. Selezionare aggiornamento del progetto sul posto.

  3. Selezionare quindi il framework di destinazione. In base al tipo di progetto che si sta aggiornando, vengono presentate diverse opzioni. .NET Standard 2.0 è una scelta ottimale se la libreria non si basa su una tecnologia desktop come WPF e può essere usata sia da progetti .NET Framework che da progetti .NET. Tuttavia, le versioni più recenti di .NET offrono numerosi miglioramenti del linguaggio e del compilatore rispetto a .NET Standard.

    Selezionare .NET 8.0 e quindi selezionare Avanti.

  4. Viene visualizzato un albero con tutti gli artefatti correlati al progetto, ad esempio file di codice e librerie. È possibile aggiornare singoli artefatti o l'intero progetto, ovvero l'impostazione predefinita. Selezionare Selezione aggiornamento per avviare l'aggiornamento.

    Al termine dell'aggiornamento, vengono visualizzati i risultati:

    la scheda risultati aggiornamento di .NET Upgrade Assistant, mostra che 7 su 21 elementi sono stati ignorati.

    Gli artefatti con un cerchio verde solido sono stati aggiornati mentre i cerchi verdi vuoti sono stati ignorati. Gli artefatti saltati indicano che l'assistente all'aggiornamento non ha trovato nulla da aggiornare.

Ora che la libreria di supporto dell'app è stata aggiornata, aggiorna l'app principale.

Aggiornare l'app

Dopo l'aggiornamento di tutte le librerie di supporto, è possibile aggiornare il progetto principale dell'app. Seguire questa procedura:

  1. Fare clic con il pulsante destro del mouse sul progetto WebSiteRatings nella finestra Esplora soluzioni e selezionareAggiorna :
  2. Selezionare come modalità di aggiornamento aggiornamento in loco del progetto.
  3. Selezionare .NET 8.0 per il framework di destinazione e selezionare Avanti.
  4. Lasciate selezionati tutti gli artefatti e selezionate Aggiorna selezione.

Al termine dell'aggiornamento, vengono visualizzati i risultati. Se un elemento ha un simbolo di avviso, significa che è presente una nota da leggere, che è possibile eseguire espandendo l'elemento.

Generare una compilazione pulita

Dopo l'aggiornamento, pulire e compilare il progetto.

  1. Fare clic con il pulsante destro del mouse sul progetto di WebSiteRatings nella finestra Esplora soluzioni e selezionare Pulisci.
  2. Fare clic con il pulsante destro del mouse sul progetto WebSiteRatings nella finestra Esplora soluzioni e selezionare Compilazione.

Se l'applicazione ha rilevato errori, è possibile trovarli nella finestra di elenco errori con una raccomandazione su come risolverli.

Passaggi successivi all'aggiornamento

Se il progetto viene aggiornato da .NET Framework a .NET, esaminare le informazioni contenute nell'articolo Modernize dopo l'aggiornamento a .NET da .NET Framework.

Dopo l'aggiornamento, è necessario:

  • Controllare i pacchetti NuGet.

    .NET Upgrade Assistant ha aggiornato alcuni pacchetti a nuove versioni. Con l'app di esempio fornita in questo articolo, il pacchetto NuGet Microsoft.Data.Sqlite è stato aggiornato da 1.0.0 a 8.0.x. Tuttavia, 1.0.0 dipende dal pacchetto NuGet SQLite, ma 8.0.x rimuove tale dipendenza. Il pacchetto NuGet SQLite fa ancora riferimento al progetto, anche se non è più necessario. I pacchetti NuGet SQLite e SQLite.Native possono essere rimossi dal progetto.

  • Pulire i pacchetti NuGet precedenti.

    Il file packages.config non è più necessario e può essere eliminato dal progetto, perché i riferimenti al pacchetto NuGet vengono ora dichiarati nel file di progetto. Inoltre, la cartella della cache del pacchetto NuGet locale, denominata Packages, si trova nella cartella o nella cartella padre del progetto. Questa cartella della cache locale può essere eliminata. I nuovi riferimenti al pacchetto NuGet usano una cartella della cache globale per i pacchetti, disponibili nella directory del profilo dell'utente, denominata .nuget\packages.

  • Rimuovere la libreria System.Configuration.

    La maggior parte delle app .NET Framework fa riferimento alla libreria System.Configuration. Dopo l'aggiornamento, è possibile che a questa libreria venga ancora fatto riferimento direttamente.

    La libreria System.Configuration usa il file app.config per fornire opzioni di configurazione in fase di esecuzione all'app. Per .NET, questa libreria è stata sostituita dal pacchetto NuGet System.Configuration.ConfigurationManager. Rimuovere il riferimento alla libreria e aggiungere il pacchetto NuGet al progetto.

  • Verificare le aree in cui ammodernare l'app.

    Le API e le librerie sono cambiate abbastanza da quando è stato rilasciato .NET. Nella maggior parte dei casi, .NET Framework non ha accesso a questi miglioramenti. Eseguendo l'aggiornamento a .NET, è ora possibile accedere a librerie più moderne.

    Le sezioni successive descrivono le aree per modernizzare l'app di esempio usata da questo articolo.

Modernizzare: controllo Web browser

Il controllo WebBrowser a cui fa riferimento l'app di esempio WPF si basa su Internet Explorer, che non è aggiornato. WPF per .NET può usare il controllo WebView2 basato su Microsoft Edge. Completare i passaggi seguenti per eseguire l'aggiornamento al nuovo controllo web browser WebView2:

  1. Aggiungi il pacchetto NuGet Microsoft.Web.WebView2.

  2. Nel file MainWindow.xaml:

    1. Importare il controllo nello spazio dei nomi wpfControls nell'elemento radice:

      <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. In basso dove viene dichiarato l'elemento <Border>, rimuovere il controllo WebBrowser e sostituirlo con il controllo wpfControls:WebView2:

      <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. Modificare il file del codice sorgente dietro MainWindow.xaml.cs. Aggiornare il metodo ListBox_SelectionChanged per impostare la proprietà browser.Source su un Urivalido. Questo codice veniva passato in precedenza come stringa nell'URL del sito Web, mentre il controllo WebView2 richiede un 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>");
    }
    

A seconda della versione di Windows in cui è in esecuzione un utente dell'app, potrebbe essere necessario installare il runtime WebView2. Per altre informazioni, vedere Introduzione a WebView2 nelle app WPF.

Modernizzare: appsettings.json

.NET Framework usa il file App.config per caricare le impostazioni per l'app, ad esempio stringhe di connessione e provider di registrazione. .NET usa ora il file appsettings.json per le impostazioni dell'app. App.config file sono supportati in .NET tramite il pacchetto NuGet System.Configuration.ConfigurationManager e il supporto per appsettings.json viene fornito dal pacchetto NuGet Microsoft.Extensions.Configuration.

Man mano che altre librerie vengono aggiornate a .NET, vengono modernizzate supportando appsettings.json anziché App.config. Ad esempio, i fornitori di log in .NET Framework che sono stati aggiornati per .NET 6+ non utilizzano più App.config per le impostazioni. È consigliabile seguire la loro direzione e anche allontanarsi dall'uso di App.config dove è possibile.

Utilizzare appsettings.json con l'app di esempio WPF

Ad esempio, dopo l'aggiornamento dell'app di esempio WPF, usare appsettings.json per la stringa di connessione al database locale.

  1. Rimuovere il pacchetto NuGet System.Configuration.ConfigurationManager.

  2. Aggiungere il pacchetto NuGet Microsoft.Extensions.Configuration.Json.

  3. Aggiungere un file al progetto denominato appsettings.json.

  4. Impostare il file appsettings.json da copiare nella directory di output.

    Imposta la copia da impostare nell'output tramite Visual Studio usando la finestra delle proprietà dopo aver selezionato il file in l'Esplora soluzioni . In alternativa, è possibile modificare direttamente il progetto e aggiungere i ItemGroupseguenti:

      <ItemGroup>
        <Content Include="appsettings.json">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </Content>
      </ItemGroup>
    
  5. Eseguire la migrazione delle impostazioni nel file App.config in un nuovo file di appsettings.json.

    Nell'app di esempio WPF app.config contiene solo una singola stringa di connessione. Modificare il file appsettings.json per definire la stringa di connessione:

    {
      "ConnectionStrings": {
        "database": "DataSource=sqlite.db;"
      }
    }
    
  6. Modificare il file di App.xaml.cs, istanziando un oggetto di configurazione che carica il file appsettings.json, vengono evidenziate le righe aggiunte:

    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. Nel file .\Models\Database.cs modificare il metodo OpenConnection per usare la nuova proprietà App.Config. Ciò richiede l’importazione del namespace Microsoft.Extensions.Configuration:

    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 è un metodo di estensione fornito dallo spazio dei nomi Microsoft.Extensions.Configuration.