Aktualisieren einer WPF-Desktop-App auf .NET 7

In diesem Artikel wird beschrieben, wie Sie ein Upgrade einer Windows Presentation Foundation-Desktop-App (WPF) auf .NET 7 durchführen. Obwohl WPF unter .NET ausgeführt wird, einer plattformübergreifenden Technologie, ist WPF immer noch ein reines Windows-Framework. Die folgenden WPF-bezogenen Projekttypen können mit dem .NET-Upgrade-Assistenten aktualisiert werden:

  • WPF-Projekt
  • Steuerelementbibliothek
  • .NET-Bibliothek

Wenn Sie ein Upgrade von .NET Framework auf .NET durchführen, sollten Sie den Artikel Unterschiede mit WPF .NET und portieren von .NET Framework zu .NET lesen.

Warnung

Aktualisieren Sie keine Visual Basic-WPF-Projekte. Es scheint einen Fehler mit der Erweiterung zu geben. Dieser Artikel wird aktualisiert, wenn der Fehler behoben wird.

Voraussetzungen

Demo-App

Dieser Artikel wurde im Zusammenhang mit dem Upgrade des Webfavoriten-Beispielprojekts geschrieben, das Sie aus dem GitHub-Repository für .NET-Beispiele herunterladen können.

Initiieren des Upgrades

Wenn Sie mehrere Projekte aktualisieren, beginnen Sie mit Projekten, die keine Abhängigkeiten aufweisen. Im Webfavoriten-Beispiel hängt das WebSiteRatings-Projekt von der StarVoteControl-Bibliothek ab, sodass StarVoteControl zuerst aktualisiert werden sollte.

Tipp

Stellen Sie sicher, dass Sie über eine Sicherung Ihres Codes verfügen, z. B. in der Quellcodeverwaltung oder einer Kopie.

Führen Sie die folgenden Schritte aus, um ein Projekt in Visual Studio zu aktualisieren:

  1. Klicken Sie im fenster Projektmappen-Explorer mit der rechten Maustaste auf das Projekt StarVoteControl, und wählen Sie Upgrade aus:

    Das Upgrade-Menüelement des .NET-Upgrade-Assistenten in Visual Studio.

    Eine neue Registerkarte wird geöffnet, auf der Sie aufgefordert werden, auszuwählen, wie das Upgrade ausgeführt werden soll.

  2. Wählen Sie Direktes Projektupgrade aus.

  3. Wählen Sie als Nächstes das Zielframework aus. Basierend auf dem Typ des Projekts, das Sie aktualisieren, werden verschiedene Optionen angezeigt. .NET Standard 2.0 ist eine gute Wahl, wenn die Bibliothek nicht auf einer Desktoptechnologie wie WPF basiert und sowohl von .NET Framework-Projekten als auch von .NET-Projekten verwendet werden kann. Die neuesten .NET-Releases bieten jedoch viele Sprach- und Compilerverbesserungen gegenüber .NET Standard.

    Wählen Sie .NET 7.0 und dann Weiter aus.

    Die Entscheidungsregisterkarte des .NET-Upgrade-Assistenten.

  4. Eine Struktur wird mit allen Artefakten im Zusammenhang mit dem Projekt angezeigt, z. B. Codedateien und Bibliotheken. Sie können einzelne Artefakte oder das gesamte Projekt aktualisieren, was die Standardeinstellung ist. Wählen Sie Upgradeauswahl aus , um das Upgrade zu starten.

    Wenn das Upgrade abgeschlossen ist, werden die Ergebnisse angezeigt:

    Die Registerkarte

    Artefakte mit einem durchgehenden grünen Kreis wurden aktualisiert, während leere grüne Kreise übersprungen wurden. Übersprungene Artefakte bedeuten, dass der Upgrade-Assistent nichts für das Upgrade gefunden hat.

Nachdem die unterstützende Bibliothek der App aktualisiert wurde, aktualisieren Sie die Standard App.

Aktualisieren der App

Nachdem alle unterstützenden Bibliotheken aktualisiert wurden, kann das Standard App-Projekt aktualisiert werden. Führen Sie die folgenden Schritte aus:

  1. Klicken Sie im fenster Projektmappen-Explorer mit der rechten Maustaste auf das Projekt WebSiteRatings, und wählen Sie Upgrade aus:
  2. Wählen Sie direktes Projektupgrade als Upgrademodus aus.
  3. Wählen Sie .NET 7.0 als Zielframework und dann Weiter aus.
  4. Lassen Sie alle Artefakte ausgewählt, und wählen Sie Auswahl aktualisieren aus.

Nach Abschluss des Upgrades werden die Ergebnisse angezeigt. Wenn ein Element über ein Warnsymbol verfügt, bedeutet dies, dass Sie eine Notiz lesen können, was Sie durch Erweitern des Elements tun können.

Generieren eines sauber Builds

Nachdem Ihr Projekt aktualisiert wurde, sauber und kompilieren Sie es.

  1. Klicken Sie im Fenster Projektmappen-Explorer mit der rechten Maustaste auf das Projekt WebSiteRatings, und wählen Sie Bereinigen aus.
  2. Klicken Sie im Fenster Projektmappen-Explorer mit der rechten Maustaste auf das Projekt WebSiteRatings, und wählen Sie Erstellen aus.

Wenn bei Ihrer Anwendung Fehler aufgetreten sind, finden Sie diese im Fenster Fehlerliste mit einer Empfehlung, wie Sie sie beheben können.

Schritte nach dem Upgrade

Wenn Ihr Projekt von .NET Framework auf .NET aktualisiert wird, lesen Sie die Informationen im Artikel Modernize after upgrade to .NET from .NET Framework.

Nach dem Upgrade möchten Sie Folgendes ausführen:

  • Überprüfen Sie Ihre NuGet-Pakete.

    Der .NET-Upgrade-Assistent hat einige Pakete auf neue Versionen aktualisiert. Mit der in diesem Artikel bereitgestellten Beispiel-App wurde das Microsoft.Data.Sqlite NuGet-Paket von 1.0.0 auf 7.0.5 aktualisiert. 1.0.0 hängt SQLite jedoch vom NuGet-Paket ab, aber 7.0.5 entfernt diese Abhängigkeit. Das SQLite Projekt verweist weiterhin auf das NuGet-Paket, obwohl es nicht mehr erforderlich ist. Sowohl als SQLite.Native auch SQLite NuGet-Pakete können aus dem Projekt entfernt werden.

  • Bereinigen Sie die alten NuGet-Pakete.

    Die packages.config-Datei ist nicht mehr erforderlich und kann aus Ihrem Projekt gelöscht werden, da die NuGet-Paketverweise jetzt in der Projektdatei deklariert werden. Darüber hinaus befindet sich der lokale NuGet-Paketcacheordner mit dem Namen Packages entweder im Ordner oder im übergeordneten Ordner des Projekts. Dieser lokale Cacheordner kann gelöscht werden. Die neuen NuGet-Paketverweise verwenden einen globalen Cacheordner für Pakete, der im Profilverzeichnis des Benutzers mit dem Namen .nuget\packages verfügbar ist.

  • Entfernen Sie die System.Configuration Bibliothek.

    Die meisten .NET Framework Apps verweisen auf die System.Configuration Bibliothek. Nach dem Upgrade ist es möglich, dass weiterhin direkt auf diese Bibliothek verwiesen wird.

    Die System.Configuration Bibliothek verwendet die app.config-Datei , um Ihrer App Laufzeitkonfigurationsoptionen bereitzustellen. Für .NET wurde diese Bibliothek durch das System.Configuration.ConfigurationManager NuGet-Paket ersetzt. Entfernen Sie den Verweis auf die Bibliothek, und fügen Sie dem Projekt das NuGet-Paket hinzu.

  • Suchen Sie nach Orten, an denen Sie Ihre App modernisieren können.

    APIs und Bibliotheken haben sich seit der Veröffentlichung von .NET erheblich geändert. In den meisten Fällen hat .NET Framework keinen Zugriff auf diese Verbesserungen. Durch das Upgrade auf .NET hat Ihr jetzt Zugriff auf modernere Bibliotheken.

    In den nächsten Abschnitten werden Bereiche beschrieben, in denen Sie die in diesem Artikel verwendete Beispiel-App modernisieren.

Modernisieren: Webbrowser-Steuerelement

Das WebBrowser-Steuerelement, auf das von der WPF-Beispiel-App verwiesen wird, basiert auf dem veralteten Internet Explorer. WPF für .NET kann das WebView2-Steuerelement verwenden, das auf Microsoft Edge basiert. Führen Sie die folgenden Schritte aus, um auf das neue WebView2-Webbrowsersteuerelement zu aktualisieren:

  1. Fügen Sie das NuGet-Paket Microsoft.Web.WebView2 hinzu.

  2. In der Datei MainWindow.xaml:

    1. Importieren Sie das Steuerelement in den wpfControls-Namespace im Stammelement:

      <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. Entfernen Sie unten, wo das <Border>-Element deklariert ist, das WebBrowser-Steuerelement, und ersetzen Sie es durch das wpfControls:WebView2-Steuerelement:

      <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. Bearbeiten Sie den MainWindow.xaml.cs-Code hinter der Datei. Aktualisieren Sie die ListBox_SelectionChanged-Methode, um die browser.Source-Eigenschaft auf einen gültigen Uri festzulegen. Dieser Code wurde früher in der Website-URL als Zeichenfolge übergeben, aber das WebView2-Steuerelement erfordert einen 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>");
    }
    

Je nachdem, welche Windows-Version ein Benutzer Ihrer App ausführt, muss er möglicherweise die WebView2-Runtime installieren. Weitere Informationen finden Sie unter Erste Schritte mit WebView2 in WPF-Apps.

Modernisieren: „appsettings.json“

.NET Framework verwendet die App.config-Datei zum Laden von Einstellungen für Ihre App, z. B. Verbindungszeichenfolgen und Protokollierungsanbieter. .NET verwendet jetzt die Datei appsettings.json für App-Einstellungen. App.config-Dateien werden in .NET über das System.Configuration.ConfigurationManager-NuGet-Paket unterstützt, und appsettings.json wird vom Microsoft.Extensions.Configuration-NuGet-Paket unterstützt.

Andere Bibliotheken werden beim Upgrade auf .NET durch die Unterstützung von appsettings.json anstelle von App.config modernisiert. Beispielsweise verwenden Protokollierungsanbieter in .NET Framework, die für .NET 6+ aktualisiert wurden, App.config nicht mehr für Einstellungen. Es ist gut, deren Richtung zu folgen und auch davon abzukommen ,App.config zu verwenden, wo Sie können.

Verwenden von „appsettings.json“ mit der WPF-Beispiel-App

Verwenden Sie beispielsweise nach dem Upgrade der WPF-Beispiel-App appsettings.json für die Verbindungszeichenfolge mit der lokalen Datenbank.

  1. Entfernen Sie das System.Configuration.ConfigurationManager-NuGet-Paket.

  2. Fügen Sie das NuGet-Paket Microsoft.Extensions.Configuration.Json hinzu.

  3. Fügen Sie dem Projekt eine Datei mit dem Namen appsettings.json hinzu.

  4. Legen Sie die Datei appsettings.json zum Kopieren in das Ausgabeverzeichnis fest.

    Legen Sie die Einstellung Kopieren in Ausgabe über Visual Studio über das Fenster Eigenschaften fest, nachdem Sie die Datei im Projektmappen-Explorer ausgewählt haben. Alternativ können Sie das Projekt direkt bearbeiten und Folgendes ItemGrouphinzufügen:

      <ItemGroup>
        <Content Include="appsettings.json">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </Content>
      </ItemGroup>
    
  5. Migrieren Sie die Einstellungen in der App.config-Datei zu einer neuen Datei appsettings.json .

    In der WPF-Beispiel-App enthieltapp.config nur eine einzige Verbindungszeichenfolge. Bearbeiten Sie die Datei appsettings.json , um die Verbindungszeichenfolge zu definieren:

    {
      "ConnectionStrings": {
        "database": "DataSource=sqlite.db;"
      }
    }
    
  6. Bearbeiten Sie die Datei App.xaml.cs , und überprüfen Sie ein Konfigurationsobjekt, das die Datei appsettings.json lädt, und die hinzugefügten Zeilen werden hervorgehoben:

    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. Ändern Sie in der Datei .\Models\Database.cs die OpenConnection-Methode, um die neue App.Config-Eigenschaft zu verwenden. Dazu muss der Namespace Microsoft.Extensions.Configuration importiert werden:

    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 ist eine Erweiterungsmethode, die vom Microsoft.Extensions.Configuration-Namespace bereitgestellt wird.