Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Artikel wird beschrieben, wie Sie eine Windows Presentation Foundation (WPF)-Desktop-App auf .NET 8 aktualisieren. Obwohl WPF auf .NET ausgeführt wird, ist WPF immer noch ein 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 vom .NET Framework auf .NET durchführen, wird empfohlen, den Artikel "Unterschiede von WPF .NET" und den Leitfaden "Migration vom .NET Framework zu .NET" zu überprüfen.
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, auf .NET 7 ausgerichtet
- Erweiterung .NET Upgrade Assistant für Visual Studio
Demo-App
Dieser Artikel wurde im Kontext des Upgrades des Web Favorites Sample-Projekts geschrieben, das Sie aus dem GitHub-Repository .NET Samples herunterladen können.
Starten 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
Achten Sie darauf, dass Sie über eine Sicherung Ihres Codes verfügen, z. B. in der Quellcodeverwaltung oder in Form 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 StarVoteControl-Projekt, 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 Projektaktualisierung vor Ort aus.
Wählen Sie dann 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 dann "Weiter" aus.
Daraufhin wird ein Baum mit allen Artefakten im Zusammenhang mit dem Projekt angezeigt, wie Codedateien und Bibliotheken. Sie können einzelne Artefakte oder das gesamte Projekt upgraden. Letzteres ist die Standardeinstellung. Wählen Sie Upgrade auswählen aus, um das Upgrade zu starten.
Nach Abschluss des Upgrades werden die Ergebnisse angezeigt:
Die Registerkarte der Upgradeergebnisse des .NET-Upgrade-Assistenten, die zeigt, dass 7 von 21 Elementen übersprungen wurden.
Für Artefakte mit einem gefüllten grünen Kreis wurde das Upgrade durchgeführt. Elemente mit einem leeren grünen Kreis wurden dagegen übersprungen. Übersprungene Artefakte bedeuten, dass der Upgrade-Assistent nichts gefunden hat, um ein Upgrade durchzuführen.
Nachdem nun das Upgrade für die unterstützende Bibliothek der App durchgeführt wurde, können Sie als Nächstes die Haupt-App upgraden.
Aktualisieren der App
Sobald alle unterstützenden Bibliotheken aktualisiert wurden, kann das Standard-App-Projekt aktualisiert werden. Führen Sie die folgenden Schritte durch:
- Klicken Sie im Projektmappen-Explorer-Fenster mit der rechten Maustaste auf das WebSiteRatings-Projekt, und wählen Sie "Upgrade" aus:
- Wählen Sie " Direktes Projektupgrade " als Upgrademodus aus.
- Wählen Sie .NET 8.0 für das Zielframework und dann "Weiter" aus.
- Behalten Sie die Auswahl aller Artefakte bei, 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 Projektmappen-Explorer-Fenster mit der rechten Maustaste auf das WebSiteRatings-Projekt, und wählen Sie "Bereinigen" aus.
- Klicken Sie im Projektmappen-Explorer-Fenster mit der rechten Maustaste auf das WebSiteRatings-Projekt, und wählen Sie "Erstellen" aus.
Wenn bei Ihrer Anwendung Fehler aufgetreten sind, finden Sie sie im Fenster Fehlerliste mit einer Empfehlung zur Behebung.
Schritte nach dem Upgrade
Wenn ihr Projekt von .NET Framework auf .NET aktualisiert wird, lesen Sie die Informationen im Modernize-Artikel nach dem Upgrade auf .NET Framework .
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.x aktualisiert. 1.0.0 hängt jedoch vom NuGet-Paket abSQLite
, aber 8.0.x entfernt diese Abhängigkeit. DasSQLite
NuGet-Paket wird weiterhin vom Projekt referenziert, obwohl es nicht mehr erforderlich ist. Sowohl dieSQLite
-NuGet-Pakete als auch dieSQLite.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. Darüber hinaus 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 mit dem Namen ".nuget\packages" verfügbar sind.
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 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 WebView2-Steuerelement basierend auf Microsoft Edge verwenden. Führen Sie die folgenden Schritte aus, um ein Upgrade auf das neue WebView2 Webbrowsersteuerelement durchzuführen:
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">
Unten, wo das
<Border>
Element deklariert wird, entfernen Sie 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 die MainWindow.xaml.cs Code-Behind-Datei. Aktualisieren Sie die
ListBox_SelectionChanged
Methode, um diebrowser.Source
Eigenschaft auf einen gültigen Urifestzulegen. Dieser Code wurde zuvor als String in der Website-URL übergeben, das Steuerelement erfordert jedoch ein WebView2.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 Version von Windows ein Benutzer Ihrer App ausführt, muss er möglicherweise die WebView2-Laufzeit 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 mehrApp.config für Einstellungen. Es ist gut, ihrer Richtung zu folgen und die Verwendung von App.config so weit wie möglich zu vermeiden.
Verwenden Sie appsettings.json mit der WPF-Beispielanwendung
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
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 die Option 'Kopieren zur Ausgabe' mithilfe des Fensters "Eigenschaften" über Visual Studio 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 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, wobei Sie ein Konfigurationsobjekt erstellen, das die appsettings.json Datei lädt, werden die hinzugefügten Zeilen 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 vom NamespaceMicrosoft.Extensions.Configuration
bereitgestellt wird.
.NET Desktop feedback