Uppgradera en WPF-skrivbordsapp till .NET 8
Den här artikeln beskriver hur du uppgraderar en WPF-skrivbordsapp (Windows Presentation Foundation) till .NET 8. Även om WPF körs på .NET, en plattformsoberoende teknik, är WPF fortfarande ett windowsbaserat ramverk. Följande WPF-relaterade projekttyper kan uppgraderas med .NET Upgrade Assistant:
- WPF-projekt
- Kontrollbibliotek
- .NET-bibliotek
Om du uppgraderar från .NET Framework till .NET kan du läsa artikeln Skillnader med WPF .NET och Porting från .NET Framework till .NET guide.
Förutsättningar
- Windows-operativsystem
- Visual Studio 2022 version 17.7 eller senare för att rikta in sig på .NET 8
- Visual Studio 2022 version 17.1 eller senare för att rikta mot .NET 7
- .NET Upgrade Assistant-tillägg för Visual Studio
Demoapp
Den här artikeln skrevs i samband med uppgraderingen av projektet Webbfavoriter-exempel, som du kan ladda ner från GitHub-lagringsplatsen .NET Samples.
Initiera uppgraderingen
Om du uppgraderar flera projekt börjar du med projekt som inte har några beroenden. I exemplet Webbfavoriter beror projektet WebSiteRatings på biblioteket StarVoteControl, så StarVoteControl- bör uppgraderas först.
Tips
Se till att ha en säkerhetskopia av koden, till exempel i källkontrollen eller en kopia.
Använd följande steg för att uppgradera ett projekt i Visual Studio:
Högerklicka på projektet StarVoteControl i fönstret Solution Explorer och välj Uppgradera:
En ny flik öppnas som uppmanar dig att välja hur du vill att uppgraderingen ska utföras.
Välj direktuppgradering av projekt.
Välj sedan målramverket. Beroende på vilken typ av projekt du uppgraderar visas olika alternativ. .NET Standard 2.0 är ett bra val om biblioteket inte förlitar sig på en skrivbordsteknik som WPF och kan användas av både .NET Framework-projekt och .NET-projekt. De senaste .NET-versionerna innehåller dock många språk- och kompilatorförbättringar jämfört med .NET Standard.
Välj .NET 8.0 och välj sedan Nästa.
Ett träd visas med alla artefakter som är relaterade till projektet, till exempel kodfiler och bibliotek. Du kan uppgradera enskilda artefakter eller hela projektet, vilket är standard. Välj Uppgradera val för att starta uppgraderingen.
När uppgraderingen är klar visas resultatet:
Artefakter med en fast grön cirkel uppgraderades medan tomma gröna cirklar hoppades över. Överhoppade artefakter innebär att uppgraderingsassistenten inte hittade något att uppgradera.
Nu när appens stödbibliotek har uppgraderats uppgraderar du huvudappen.
Uppgradera appen
När alla stödbibliotek har uppgraderats kan huvudappprojektet uppgraderas. Utför följande steg:
- Högerklicka på projektet WebSiteRatings i fönstret Solution Explorer och välj Uppgradera:
- Välj Lokal projektuppgradering som uppgraderingsalternativ.
- Välj .NET 8.0 för målramverket och välj Nästa.
- Låt alla artefakter vara markerade och välj Uppgraderingsval.
När uppgraderingen är klar visas resultatet. Om ett objekt har en varningssymbol innebär det att det finns en anteckning som du kan läsa, vilket du kan göra genom att expandera objektet.
Generera en ren version
När projektet har uppgraderats rensar du och kompilerar det.
- Högerklicka på projektet WebSiteRatings i fönstret Solution Explorer och välj Rensa.
- Högerklicka på projektet WebSiteRatings i fönstret Solution Explorer och välj Build.
Om programmet påträffade några fel kan du hitta dem i fönstret fellista med en rekommendation om hur du åtgärdar dem.
Steg efter uppgraderingen
Om projektet uppgraderas från .NET Framework till .NET läser du informationen i artikeln Modernisera efter uppgradering till .NET från .NET Framework.
När du har uppgraderat vill du:
Kontrollera dina NuGet-paket.
.NET Upgrade Assistant uppgraderade vissa paket till nya versioner. Med exempelappen i den här artikeln uppgraderades
Microsoft.Data.Sqlite
NuGet-paketet från 1.0.0 till 8.0.x. Men 1.0.0 beror påSQLite
NuGet-paketet, men 8.0.x tar bort beroendet. NuGet-paketetSQLite
refereras fortfarande av projektet, även om det inte längre krävs. Du kan ta bort BådeSQLite
- ochSQLite.Native
NuGet-paketen från projektet.Rensa de gamla NuGet-paketen.
Den packages.config filen krävs inte längre och kan tas bort från projektet eftersom NuGet-paketreferenserna nu deklareras i projektfilen. Dessutom finns den lokala NuGet-paketcachemappen med namnet Packagesi antingen mappen eller den överordnade mappen i projektet. Den här lokala cachemappen kan tas bort. De nya NuGet-paketreferenserna använder en global cachemapp för paket som är tillgängliga i användarens profilkatalog med namnet .nuget\packages.
Ta bort
System.Configuration
-biblioteket.De flesta .NET Framework-appar refererar till biblioteket
System.Configuration
. Efter uppgraderingen är det möjligt att det här biblioteket fortfarande refereras direkt.System.Configuration
-biblioteket använder app.config-filen för att tillhandahålla körningskonfigurationsalternativ till din app. För .NET ersattes det här biblioteket avSystem.Configuration.ConfigurationManager
NuGet-paketet. Ta bort referensen till biblioteket och lägg till NuGet-paketet i projektet.Sök efter platser där du kan modernisera din app.
API:er och bibliotek har ändrats en hel del sedan .NET släpptes. Och i de flesta fall har .NET Framework inte åtkomst till dessa förbättringar. Genom att uppgradera till .NET har du nu åtkomst till modernare bibliotek.
I nästa avsnitt beskrivs områden där du moderniserar exempelappen som används i den här artikeln.
Modernisera: Webbläsarkontroll
Den WebBrowser kontroll som refereras av WPF-exempelappen baseras på Internet Explorer, som är inaktuellt. WPF för .NET kan använda WebView2-kontrollen baserat på Microsoft Edge. Slutför följande steg för att uppgradera till den nya WebView2 webbläsarkontrollen:
Lägg till
Microsoft.Web.WebView2
NuGet-paketet.I filen MainWindow.xaml:
Importera kontrollen till wpfControls namnrymd i rotelementet:
<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">
Där
<Border>
-elementet deklareras, ta bortWebBrowser
-kontrollen och ersätt den medwpfControls:WebView2
-kontrollen:<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>
Redigera MainWindow.xaml.cs koden bakom filen. Uppdatera metoden
ListBox_SelectionChanged
för att ange egenskapenbrowser.Source
till en giltig Uri. Den här koden skickades tidigare i webbplats-URL:en som en sträng, men WebView2-kontrollen kräver enUri
.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>"); }
Beroende på vilken version av Windows som en användare av din app kör kan de behöva installera WebView2-körningen. Mer information finns i Komma igång med WebView2 i WPF-appar.
Modernisera: appsettings.json
.NET Framework använder App.config-filen för att läsa in inställningar för din app, till exempel anslutningssträngar och loggningsproviders. .NET använder nu appsettings.json-filen för appinställningar.
App.config filer stöds i .NET via System.Configuration.ConfigurationManager
NuGet-paketet och stöd för appsettings.json tillhandahålls av Microsoft.Extensions.Configuration
NuGet-paketet.
När andra bibliotek uppgraderar till .NET moderniseras de genom att stödja appsettings.json i stället för App.config. Loggningsproviders i .NET Framework som har uppgraderats för .NET 6+ använder till exempel inte längre App.config för inställningar. Det är bra att följa deras riktning och även gå bort från att använda App.config där du kan.
Använda appsettings.json med WPF-exempelappen
När du har uppgraderat WPF-exempelappen använder du till exempel appsettings.json för anslutningssträngen till den lokala databasen.
Ta bort
System.Configuration.ConfigurationManager
NuGet-paketet.Lägg till
Microsoft.Extensions.Configuration.Json
NuGet-paketet.Lägg till en fil i projektet med namnet appsettings.json.
Ange appsettings.json filen som ska kopieras till utdatakatalogen.
Ange kopia till utdata-inställningar via Visual Studio med hjälp av fönstret Egenskaper efter att du har valt filen i lösningsutforskaren. Du kan också redigera projektet direkt och lägga till följande
ItemGroup
:<ItemGroup> <Content Include="appsettings.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup>
Migrera inställningarna i App.config-filen till en ny appsettings.json fil.
I WPF-exempelappen innehöll app.config bara en enda anslutningssträng. Redigera appsettings.json-filen för att definiera anslutningssträngen:
{ "ConnectionStrings": { "database": "DataSource=sqlite.db;" } }
Redigera App.xaml.cs-filen genom att instansiera ett konfigurationsobjekt som läser in appsettings.json-filen. De tillagda raderna är markerade:
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(); } } }
I filen .\Models\Database.cs ändrar du metoden
OpenConnection
så att den nya egenskapenApp.Config
används. Detta kräver attMicrosoft.Extensions.Configuration
namnområde importeras: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
är en tilläggsmetod som tillhandahålls avMicrosoft.Extensions.Configuration
-namnområdet.
.NET Desktop feedback