Обновление классического приложения WPF до .NET 8
В этой статье описывается обновление классического приложения Windows Presentation Foundation (WPF) до .NET 8. Несмотря на то, что WPF работает в .NET, кроссплатформенная технология, WPF по-прежнему является платформой только для Windows. Следующие типы проектов, связанных с WPF, можно обновить с помощью помощника по обновлению .NET:
- Проект WPF
- Библиотека элементов управления
- Библиотека .NET
Если вы обновляете платформу с .NET Framework на .NET, ознакомьтесь со статьей «Различия с WPF .NET» и руководством по переносу с .NET Framework на .NET.
Необходимые условия
- Операционная система Windows
- Visual Studio 2022 версии 17.7 или более поздней, чтобы разрабатывать под .NET 8
- Visual Studio 2022 версии 17.1 или более поздней для целевой платформы .NET 7
- расширение помощника по обновлению .NET для Visual Studio
Демонстрационная версия приложения
Эта статья была написана в контексте обновления проекта Web Favorites Sample , который можно скачать из репозитория GitHub .NET Samples .
Запуск обновления
Если вы обновляете несколько проектов, начните с проектов, которые не имеют зависимостей. В примере "Избранное в Интернете" проект WebSiteRatings зависит от библиотеки StarVoteControl, поэтому сначала необходимо обновить StarVoteControl.
Совет
Обязательно создайте резервную копию кода, например, в системе управления версиями или в виде отдельной копии.
Чтобы обновить проект в Visual Studio, выполните следующие действия.
Щелкните правой кнопкой мыши проект StarVoteControl
в окне обозревателя решений и выберите Обновление :Откроется новая вкладка, которая предлагает выбрать способ выполнения обновления.
Выберите локальное обновление проекта.
Затем выберите целевую платформу. В зависимости от типа проекта, который вы обновляете, представлены разные варианты. .NET Standard 2.0 является хорошим выбором, если библиотека не полагается на классические технологии, такие как WPF, и может использоваться как проектами .NET Framework, так и проектами .NET. Однако последние выпуски .NET предоставляют множество улучшений языка и компилятора по сравнению с .NET Standard.
Выберите .NET 8.0 и нажмите кнопку Далее.
Дерево отображается со всеми артефактами, связанными с проектом, такими как файлы кода и библиотеки. Вы можете обновить отдельные артефакты или весь проект, который используется по умолчанию. Выберите выбор обновления, чтобы начать обновление.
После завершения обновления отображаются результаты:
Артефакты со сплошным зеленым кругом были обновлены, а пустые зеленые круги пропускались. Пропущенные элементы означают, что помощник по обновлению не обнаружил ничего, что можно обновить.
Теперь, когда поддержка библиотеки приложения обновлена, обновите основное приложение.
Обновление приложения
После обновления всех вспомогательных библиотек можно обновить основной проект приложения. Выполните следующие действия.
- Щелкните правой кнопкой мыши проект WebSiteRatings в окне Проводник решений и выберите Обновить.
- Выберите обновление проекта на месте в качестве режима обновления.
- Выберите .NET 8.0 для целевой платформы и выберите Далее.
- Оставьте все артефакты выбранными и выберите выбора обновления.
После завершения обновления отображаются результаты. Если у элемента есть символ предупреждения, это означает, что для прочтения имеется замечание, которое можно увидеть, развернув элемент.
Создайте чистую сборку
После обновления проекта очистите и скомпилируйте его.
- Щелкните правой кнопкой мыши на проекте WebSiteRatings в окне обозревателя решений и выберите Очистка.
- Щелкните правой кнопкой мыши на проекте WebSiteRatings в окне Обозреватель решений и выберите Сборка.
Если приложение столкнулось с любыми ошибками, их можно найти в окне список ошибок с рекомендацией по их устранению.
Этапы после обновления
Если проект обновляется с .NET Framework до .NET, просмотрите сведения в статье о модернизации после обновления с .NET Framework до .NET.
После обновления вам потребуется:
Проверьте пакеты NuGet.
Помощник по обновлению .NET обновил некоторые пакеты до новых версий. В примере приложения, предоставленного в этой статье, пакет NuGet
Microsoft.Data.Sqlite
был обновлен с 1.0.0.0 до 8.0.x. Однако 1.0.0.0 зависит от пакета NuGetSQLite
, но 8.0.x удаляет эту зависимость. Пакет NuGetSQLite
по-прежнему указан в ссылках проекта, хотя он больше не требуется. из проекта можно удалить пакеты NuGet какSQLite
, так иSQLite.Native
.Очистите старые пакеты NuGet.
Файл packages.config больше не требуется и его можно удалить из проекта, так как ссылки на пакеты NuGet теперь объявляются в файле проекта. Кроме того, локальная папка кэша пакетов NuGet с именем Пакетынаходится в папке или родительской папке проекта. Эту папку локального кэша можно удалить. Новые ссылки на пакет NuGet используют глобальную папку кэша для пакетов, доступную в каталоге профилей пользователя с именем .nuget\packages.
Удалите библиотеку
System.Configuration
.Большинство приложений .NET Framework ссылались на библиотеку
System.Configuration
. После обновления возможно, что на эту библиотеку по-прежнему ссылаются напрямую.Библиотека
System.Configuration
использует файл app.config для предоставления опций конфигурации в процессе работы вашего приложения. Для .NET эта библиотека была заменена пакетом NuGetSystem.Configuration.ConfigurationManager
. Удалите ссылку на библиотеку и добавьте пакет NuGet в проект.Проверьте места для модернизации приложения.
API и библиотеки существенно изменились с момента выпуска .NET. В большинстве случаев платформа .NET Framework не имеет доступа к этим улучшениям. Обновив до .NET, теперь у вас есть доступ к более современным библиотекам.
В следующих разделах описываются области модернизации примера приложения, используемого в этой статье.
Модернизация: элемент управления веб-браузером
Элемент управления WebBrowser, на который ссылается пример приложения WPF, основан на Internet Explorer, который устарел. WPF для .NET может использовать элемент управления WebView2 на основе Microsoft Edge. Выполните следующие действия, чтобы выполнить обновление до нового элемента управления веб-браузера WebView2:
Добавьте пакет NuGet
Microsoft.Web.WebView2
.В файле MainWindow.xaml:
Импортируйте элемент управления в пространство имен wpfControls в корневом элементе:
<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">
Там, где объявлен элемент
<Border>
, удалите контрольWebBrowser
и замените его на контрольwpfControls:WebView2
.<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>
Измените файл MainWindow.xaml.cs кода за файлом. Обновите метод
ListBox_SelectionChanged
, чтобы задать для свойстваbrowser.Source
допустимый Uri. Этот код ранее передавался в URL-адрес веб-сайта в виде строки, но теперь элемент управления WebView2 требует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>"); }
В зависимости от того, какая версия Windows запущена пользователем приложения, может потребоваться установить среду выполнения WebView2. Дополнительные сведения см. в статье Начало работы с WebView2 в приложениях WPF.
Модернизация: appsettings.json
Платформа .NET Framework использует файл App.config для загрузки параметров приложения, таких как строки подключения и поставщики ведения журнала. Теперь .NET использует файл appsettings.json для параметров приложения.
App.config файлы поддерживаются в .NET с помощью пакета NuGet System.Configuration.ConfigurationManager
, а поддержка appsettings.json предоставляется пакетом NuGet Microsoft.Extensions.Configuration
.
При обновлении других библиотек до .NET они модернизируются, поддерживая appsettings.json вместо App.config. Например, поставщики журналов в .NET Framework, которые были обновлены для .NET 6+ больше не используют App.config для параметров. Хорошо следовать их указаниям и, насколько возможно, отойти от использования App.config.
Используйте appsettings.json в примере приложения WPF
Например, после обновления примера приложения WPF используйте appsettings.json для строки подключения к локальной базе данных.
Удалите пакет NuGet
System.Configuration.ConfigurationManager
.Добавьте пакет NuGet
Microsoft.Extensions.Configuration.Json
.Добавьте файл в проект с именем appsettings.json.
Задайте файл appsettings.json для копирования в выходной каталог.
Задайте
копирования для вывода с помощью Visual Studio с помощью окнасвойств после выбора файла вобозревателя решений. Кроме того, можно изменить проект непосредственно и добавить следующие ItemGroup
:<ItemGroup> <Content Include="appsettings.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup>
Перенос параметров в файл App.config в новый файл appsettings.json.
В примере приложения WPF app.config содержит только одну строку подключения. Измените файл appsettings.json, чтобы определить строку подключения:
{ "ConnectionStrings": { "database": "DataSource=sqlite.db;" } }
Измените файл App.xaml.cs, загрузив объект конфигурации, который загружает файл appsettings.json, выделены добавленные строки:
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(); } } }
В файле .\Models\Database.cs измените метод
OpenConnection
, чтобы использовать новое свойствоApp.Config
. Для этого требуется импортировать пространство именMicrosoft.Extensions.Configuration
: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
— это метод расширения, предоставляемый пространством именMicrosoft.Extensions.Configuration
.
.NET Desktop feedback