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. Auch wenn 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 sich den Artikel Unterschiede mit WPF .NET und den Leitfaden zum Portieren von .NET Framework zu .NET ansehen.

Warnung

Aktualisieren Sie keine Visual Basic-WPF-Projekte. Es scheint einen Fehler bei 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 Webfavoritenbeispielprojekts geschrieben, das Sie aus dem GitHub-Repository .NET Samples herunterladen können.

Initiieren des Upgrades

Wenn Sie mehrere Projekte aktualisieren, beginnen Sie mit Projekten ohne Abhängigkeiten. Im Webfavoritenbeispiel 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 Projektmappen-Explorer Fenster 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. Je nach Art 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 für das Zielframework.

  4. Es wird eine Struktur mit allen Artefakten angezeigt, die sich auf das Projekt beziehen, z. B. Codedateien und Bibliotheken. Sie können einzelne Artefakte oder das gesamte Projekt aktualisieren, was die Standardeinstellung ist. Wählen Sie Upgrade-Auswahl aus , um das Upgrade zu starten.

    Wenn das Upgrade abgeschlossen ist, werden die Ergebnisse angezeigt:

    Die Registerkarte

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

Nachdem die unterstützende Bibliothek der App nun 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 Projektmappen-Explorer Fenster 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 für das Zielframework und dann Weiter aus.
  4. Lassen Sie alle Artefakte ausgewählt, und wählen Sie Upgrade-Auswahl 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, die 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 Clean (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 behoben werden 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 jedoch vom NuGet-Paket abSQLite, 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 Laufzeitkonfigurationsoptionen für Ihre App bereitzustellen. Für .NET wurde diese Bibliothek durch das NuGet-Paket System.Configuration.ConfigurationManager 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 einiges geändert. In den meisten Fällen hat .NET Framework keinen Zugriff auf diese Verbesserungen. Durch das Upgrade auf .NET haben Sie 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 basierend auf Microsoft Edge verwenden. 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.