So aktualisieren Sie eine WPF-Desktop-App auf .NET 8
In diesem Artikel wird beschrieben, wie Sie eine Windows Presentation Foundation (WPF)-Desktop-App auf .NET 8 aktualisieren. Obwohl WPF auf .NET, einer plattformübergreifenden Technologie, ausgeführt wird, ist WPF immer noch ein Framework ausschließlich für Windows. 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 ggf. mit dem Artikel Unterschiede zu WPF .NET und mit dem Leitfaden Übersicht über das Portieren von .NET Framework zu .NET vertraut machen.
Voraussetzungen
- Windows-Betriebssystem
- Visual Studio 2022, Version 17.7 oder höher für .NET 8
- Visual Studio 2022, Version 17.1 oder höher für .NET 7
- Erweiterung des Upgrade-Assistenten für .NET für Visual Studio
Demo-Anwendung
Dieser Artikel wurde im Rahmen der Aktualisierung des Web Favorites Beispielprojekts geschrieben, das Sie aus dem .NET Samples GitHub-Repositoryherunterladen können.
Starten des Upgrades
Wenn Sie mehrere Projekte aktualisieren, beginnen Sie mit Projekten ohne Abhängigkeiten. Im Beispiel "Webfavoriten" hängt das WebSiteRatings- Projekt von der StarVoteControl-Bibliothek ab, daher sollte StarVoteControl zuerst aktualisiert werden.
Tipp
Achten Sie darauf, dass Sie über eine Sicherungskopie 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 Fenster Projektmappen-Explorer mit der rechten Maustaste auf das Projekt StarVoteControl, und wählen Sie Upgrade aus:
Es wird eine neue Registerkarte geöffnet, die Sie auffordert, auszuwählen, wie das Upgrade ausgeführt werden soll.
Wählen Sie Direktes Projektupgrade aus.
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 eine Desktoptechnologie wie WPF basiert und sowohl von .NET Framework-Projekten als auch .NET-Projekten verwendet werden kann. Die neuesten .NET-Versionen bieten jedoch viele Sprach- und Compilerverbesserungen gegenüber .NET Standard.
Wählen Sie .NET 8.0 und anschließend Weiter aus.
Eine Baumstruktur wird angezeigt, die alle mit dem Projekt verbundenen Artefakte wie Quellcodedateien und Bibliotheken umfasst. Sie können einzelne Artefakte oder das gesamte Projekt aktualisieren, was die Standardeinstellung ist. Wählen Sie Auswahl upgraden aus, um das Upgrade zu starten.
Wenn das Upgrade abgeschlossen ist, werden die Ergebnisse angezeigt:
Artefakte mit einem soliden grünen Kreis wurden aktualisiert, während leere grüne Kreise übersprungen wurden. Übersprungene Artefakte bedeuten, dass der Upgrade-Assistent nichts gefunden hat, um ein Upgrade durchzuführen.
Nachdem die unterstützende Bibliothek der App aktualisiert wurde, aktualisieren Sie die Haupt-App.
Aktualisieren der App
Sobald alle unterstützenden Bibliotheken aktualisiert wurden, kann das Haupt-App-Projekt aktualisiert werden. Führen Sie die folgenden Schritte aus:
- Klicken Sie im Fenster Projektmappen-Explorer mit der rechten Maustaste auf das Projekt WebSiteRatings, und wählen Sie Upgrade aus:
- Wählen Sie als Upgrademodus die Option Direktes Projektupgrade aus.
- Wählen Sie als Zielframework die Option .NET 8.0 und anschließend Weiter aus.
- Lassen Sie alle Artefakte ausgewählt, und wählen Sie Auswahl upgraden aus.
Nach Abschluss des Upgrades werden die Ergebnisse angezeigt. Wenn ein Element über ein Warnsymbol verfügt, bedeutet dies, dass es eine Notiz für Sie gibt, die Sie lesen können, indem Sie das Element erweitern.
Generieren eines bereinigten Builds
Nachdem das Projekt aktualisiert wurde, bereinigen Sie es, und kompilieren Sie es.
- Klicken Sie im Fenster Projektmappen-Explorer mit der rechten Maustaste auf das Projekt WebSiteRatings, und wählen Sie 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 sie in der Fehlerliste Fenster mit einer Empfehlung, wie Sie sie beheben können.
Schritte nach dem Upgrade
Falls für Ihr Projekt ein Upgrade von .NET Framework auf .NET durchgeführt wird, lesen Sie die Informationen im Artikel Modernisieren nach dem Upgrade von .NET Framework auf .NET.
Nach dem Upgrade möchten Sie:
Ü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 8.0.xaktualisiert. 1.0.0 hängt jedoch vomSQLite
NuGet-Paket ab, aber 8.0.x entfernt diese Abhängigkeit. Auf dasSQLite
NuGet-Paket wird weiterhin vom Projekt verwiesen, obwohl es nicht mehr erforderlich ist. Sowohl dieSQLite
- als auchSQLite.Native
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. Zudem befindet sich der lokale NuGet-Paketcacheordner namens 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, die im Profilverzeichnis des Benutzers verfügbar sind, mit dem Namen .nuget\packages.
Entfernen Sie die Bibliothek
System.Configuration
.Die meisten .NET Framework-Apps verweisen auf die
System.Configuration
-Bibliothek. Nach dem Upgrade ist es möglich, dass diese Bibliothek immer noch direkt referenziert wird.Die
System.Configuration
-Bibliothek verwendet die app.config Datei, um Ihrer App Laufzeitkonfigurationsoptionen bereitzustellen. Für .NET wurde diese Bibliothek durch dasSystem.Configuration.ConfigurationManager
NuGet-Paket ersetzt. Entfernen Sie den Verweis auf die Bibliothek, und fügen Sie dem Projekt das NuGet-Paket hinzu.Überprüfen Sie, wo Ihre App modernisiert werden soll.
APIs und Bibliotheken haben sich seit der Veröffentlichung von .NET ziemlich geändert. Und 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 von diesem Artikel verwendete Beispiel-App modernisieren.
Modernisieren: Webbrowser-Steuerelement
Das WebBrowser Steuerelement, auf das von der WPF-Beispiel-App verwiesen wird, basiert auf Internet Explorer, das veraltet ist. WPF für .NET kann das auf Microsoft Edge basierende WebView2-Steuerelement verwenden. Führen Sie die folgenden Schritte aus, um auf das neue WebView2-Webbrowsersteuerelement zu aktualisieren:
Fügen Sie das
Microsoft.Web.WebView2
NuGet-Paket 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 eine benutzende Person Ihrer App ausführt, muss diese 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 appsettings.json Datei für App-Einstellungen. App.config Dateien werden in .NET über das System.Configuration.ConfigurationManager
NuGet-Paket unterstützt, und die Unterstützung für appsettings.json wird vom Microsoft.Extensions.Configuration
NuGet-Paket bereitgestellt.
Während andere Bibliotheken auf .NET aktualisieren, modernisieren sie, indem sie appsettings.json anstelle von App.configunterstützen. Beispielsweise verwenden Protokollierungsanbieter in .NET Framework, die für .NET 6+ aktualisiert wurden, nicht mehr App.config für Einstellungen. Es empfiehlt sich, diesem Beispiel zu folgen und App.config nach Möglichkeit nicht mehr zu verwenden.
Verwenden von „appsettings.json“ mit der WPF-Beispiel-App
Verwenden Sie beispielsweise nach dem Upgraden der WPF-Beispiel-App die Datei appsettings.json für die Verbindungszeichenfolge für die lokale Datenbank.
Entfernen Sie das
System.Configuration.ConfigurationManager
NuGet-Paket.Fügen Sie das
Microsoft.Extensions.Configuration.Json
NuGet-Paket hinzu.Fügen Sie dem Projekt eine Datei mit dem Namen appsettings.jsonhinzu.
Legen Sie die appsettings.json Datei fest, die in das Ausgabeverzeichnis kopiert werden soll.
Legen Sie über Visual Studio die Einstellung In Ausgabeverzeichnis kopieren im Fenster Eigenschaften fest, nachdem Sie die Datei im Projektmappen-Explorer ausgewählt haben. Alternativ können Sie das Projekt direkt bearbeiten und die folgende Elementgruppe (
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 appsettings.json Datei.
In der WPF-Beispiel-App enthielt app.config nur eine einzelne Verbindungszeichenfolge. Bearbeiten Sie die appsettings.json Datei, um die Verbindungszeichenfolge zu definieren:
{ "ConnectionStrings": { "database": "DataSource=sqlite.db;" } }
Bearbeiten Sie die App.xaml.cs Datei, indem Sie ein Konfigurationsobjekt instanziieren, das die appsettings.json Datei lädt; 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 derMicrosoft.Extensions.Configuration
-Namespace 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.
.NET Desktop feedback