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
- Windows-Betriebssystem
- Visual Studio 2022 Version 17.1 oder höher für .NET 7
- Visual Studio 2022 Version 17.7 Preview 1 oder höher für .NET 8
- Erweiterung des .NET-Upgrade-Assistenten für Visual Studio
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:
Klicken Sie im Projektmappen-Explorer Fenster mit der rechten Maustaste auf das Projekt StarVoteControl, und wählen Sie Upgrade aus:
Eine neue Registerkarte wird geöffnet, auf der Sie aufgefordert werden, auszuwählen, wie das Upgrade ausgeführt werden soll.
Wählen Sie Direktes Projektupgrade aus.
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.
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:
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:
- Klicken Sie im Projektmappen-Explorer Fenster mit der rechten Maustaste auf das Projekt WebSiteRatings, und wählen Sie Upgrade aus:
- Wählen Sie direktes Projektupgrade als Upgrademodus aus.
- Wählen Sie .NET 7.0 für das Zielframework und dann Weiter aus.
- 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.
- Klicken Sie im fenster Projektmappen-Explorer mit der rechten Maustaste auf das Projekt WebSiteRatings, und wählen Sie Clean (Bereinigen) aus.
- 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. DasSQLite
Projekt verweist weiterhin auf das NuGet-Paket, obwohl es nicht mehr erforderlich ist. Sowohl alsSQLite.Native
auchSQLite
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-PaketSystem.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:
Fügen Sie das NuGet-Paket
Microsoft.Web.WebView2
hinzu.In der Datei MainWindow.xaml:
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">
Entfernen Sie unten, wo das
<Border>
-Element deklariert ist, dasWebBrowser
-Steuerelement, und ersetzen Sie es durch daswpfControls: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>
Bearbeiten Sie den MainWindow.xaml.cs-Code hinter der Datei. Aktualisieren Sie die
ListBox_SelectionChanged
-Methode, um diebrowser.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 einenUri
.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.
Entfernen Sie das
System.Configuration.ConfigurationManager
-NuGet-Paket.Fügen Sie das NuGet-Paket
Microsoft.Extensions.Configuration.Json
hinzu.Fügen Sie dem Projekt eine Datei mit dem Namen appsettings.json hinzu.
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
ItemGroup
hinzufügen:<ItemGroup> <Content Include="appsettings.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup>
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;" } }
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(); } } }
Ändern Sie in der Datei .\Models\Database.cs die
OpenConnection
-Methode, um die neueApp.Config
-Eigenschaft zu verwenden. Dazu muss der NamespaceMicrosoft.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 vomMicrosoft.Extensions.Configuration
-Namespace bereitgestellt wird.