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
- Sistema operativo Windows
- Visual Studio 2022 versione 17.7 o successiva per usare .NET 8
- Visual Studio 2022 versione 17.1 o successiva per .NET 7
- Estensione Assistente di aggiornamento .NET per Visual Studio
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
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:
Fare clic con il pulsante destro del mouse sul progetto
StarVoteControl nella finestra Esplora soluzioni e selezionare Aggiorna :Viene aperta una nuova scheda che richiede di scegliere la modalità di esecuzione dell'aggiornamento.
Selezionare aggiornamento del progetto sul posto.
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.
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:
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:
- Fare clic con il pulsante destro del mouse sul progetto
WebSiteRatings nella finestraEsplora soluzioni e selezionareAggiorna: - Selezionare come modalità di aggiornamento aggiornamento in loco del progetto.
- Selezionare .NET 8.0 per il framework di destinazione e selezionare Avanti.
- 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.
- Fare clic con il pulsante destro del mouse sul progetto di WebSiteRatings
nella finestra Esplora soluzioni e selezionare Pulisci . - 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 NuGetSQLite
, ma 8.0.x rimuove tale dipendenza. Il pacchetto NuGetSQLite
fa ancora riferimento al progetto, anche se non è più necessario. I pacchetti NuGetSQLite
eSQLite.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 NuGetSystem.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:
Aggiungi il pacchetto NuGet
Microsoft.Web.WebView2
.Nel file MainWindow.xaml:
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">
In basso dove viene dichiarato l'elemento
<Border>
, rimuovere il controlloWebBrowser
e sostituirlo con il controllowpfControls: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>
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 unUri
.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.
Rimuovere il pacchetto NuGet
System.Configuration.ConfigurationManager
.Aggiungere il pacchetto NuGet
Microsoft.Extensions.Configuration.Json
.Aggiungere un file al progetto denominato appsettings.json.
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
ItemGroup
seguenti:<ItemGroup> <Content Include="appsettings.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup>
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;" } }
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(); } } }
Nel file .\Models\Database.cs modificare il metodo
OpenConnection
per usare la nuova proprietàApp.Config
. Ciò richiede l’importazione del namespaceMicrosoft.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 nomiMicrosoft.Extensions.Configuration
.
.NET Desktop feedback