Dela via


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

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:

  1. Högerklicka på projektet StarVoteControl i fönstret Solution Explorer och välj Uppgradera:

    .NET Upgrade Assistants uppgraderingsmenyalternativ i Visual Studio.

    En ny flik öppnas som uppmanar dig att välja hur du vill att uppgraderingen ska utföras.

  2. Välj direktuppgradering av projekt.

  3. 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.

  4. 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:

    .NET Upgrade Assistants uppgraderingsresultatflik, som visar att 7 av de 21 objekten hoppades över.

    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:

  1. Högerklicka på projektet WebSiteRatings i fönstret Solution Explorer och välj Uppgradera:
  2. Välj Lokal projektuppgradering som uppgraderingsalternativ.
  3. Välj .NET 8.0 för målramverket och välj Nästa.
  4. 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.

  1. Högerklicka på projektet WebSiteRatings i fönstret Solution Explorer och välj Rensa.
  2. 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-paketet SQLite refereras fortfarande av projektet, även om det inte längre krävs. Du kan ta bort Både SQLite- och SQLite.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 av System.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:

  1. Lägg till Microsoft.Web.WebView2 NuGet-paketet.

  2. I filen MainWindow.xaml:

    1. 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">
      
    2. Där <Border>-elementet deklareras, ta bort WebBrowser-kontrollen och ersätt den med wpfControls: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>
      
  3. Redigera MainWindow.xaml.cs koden bakom filen. Uppdatera metoden ListBox_SelectionChanged för att ange egenskapen browser.Source till en giltig Uri. Den här koden skickades tidigare i webbplats-URL:en som en sträng, men WebView2-kontrollen kräver en 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>");
    }
    

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.

  1. Ta bort System.Configuration.ConfigurationManager NuGet-paketet.

  2. Lägg till Microsoft.Extensions.Configuration.Json NuGet-paketet.

  3. Lägg till en fil i projektet med namnet appsettings.json.

  4. 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>
    
  5. 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;"
      }
    }
    
  6. 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();
            }
        }
    }
    
  7. I filen .\Models\Database.cs ändrar du metoden OpenConnection så att den nya egenskapen App.Config används. Detta kräver att Microsoft.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 av Microsoft.Extensions.Configuration-namnområdet.