Обновление классического приложения 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.

Необходимые компоненты

Демонстрационное приложение

Эта статья была написана в контексте обновления примера веб-избранного проекта, который можно скачать из репозитория GitHub для примеров .NET.

Запуск обновления

Если вы обновляете несколько проектов, начните с проектов, которые не имеют зависимостей. В примере "Избранное в Интернете" проект WebSiteRatings зависит от библиотеки StarVoteControl , поэтому StarVoteControl следует обновить сначала.

Совет

Обязательно создайте резервную копию кода, например в системе управления версиями или копии.

Чтобы обновить проект в Visual Studio, выполните следующие действия.

  1. Щелкните правой кнопкой мыши проект StarVoteControl в окне Обозреватель решений и выберите "Обновить".

    The .NET Upgrade Assistant's Upgrade menu item in Visual Studio.

    Откроется новая вкладка, которая предлагает выбрать способ выполнения обновления.

  2. Выберите обновление проекта на месте.

  3. Затем выберите целевую платформу. В зависимости от типа обновляемого проекта представлены различные параметры. .NET Standard 2.0 является хорошим выбором, если библиотека не полагается на классические технологии, такие как WPF, и может использоваться как платформа .NET Framework проектами, так и проектами .NET. Однако последние выпуски .NET предоставляют множество улучшений языка и компилятора по сравнению с .NET Standard.

    Выберите .NET 8.0 и нажмите кнопку "Далее".

  4. Дерево отображается со всеми артефактами, связанными с проектом, такими как файлы кода и библиотеки. Вы можете обновить отдельные артефакты или весь проект, который используется по умолчанию. Выберите пункт "Обновить", чтобы начать обновление.

    После завершения обновления отображаются результаты:

    The .NET Upgrade Assistant's upgrade results tab, showing 7 out of the 21 items were skipped.

    Артефакты с твердым зеленым кругом были обновлены, в то время как пустые зеленые круги пропускались. Пропущенные артефакты означают, что обновление помощник не нашли ничего для обновления.

Теперь, когда поддержка библиотеки приложения обновлена, обновите основное приложение.

Обновление приложения

После обновления всех вспомогательных библиотек можно обновить основной проект приложения. Выполните следующие шаги:

  1. Щелкните правой кнопкой мыши проект WebSiteRatings в окне Обозреватель решений и выберите пункт "Обновить".
  2. Выберите обновление проекта на месте в качестве режима обновления.
  3. Выберите .NET 8.0 для целевой платформы и нажмите кнопку "Далее".
  4. Оставьте все артефакты выбранными и выберите пункт "Обновить".

После завершения обновления отображаются результаты. Если у элемента есть символ предупреждения, это означает, что для чтения есть заметка, которую можно сделать, разверните элемент.

Создание чистой сборки

После обновления проекта очистите и скомпилируйте его.

  1. Щелкните правой кнопкой мыши проект WebSiteRatings в окне Обозреватель решений и нажмите кнопку "Очистить".
  2. Щелкните правой кнопкой мыши проект WebSiteRatings в окне Обозреватель решений и выберите "Сборка".

Если приложение столкнулось с любыми ошибками, их можно найти в окне списка ошибок с рекомендацией по их устранению.

Действия после обновления

Если проект обновляется с платформа .NET Framework до .NET, просмотрите сведения в статье "Модернизация" после обновления до .NET из статьи платформа .NET Framework.

После обновления вам потребуется:

  • Проверьте пакеты NuGet.

    Помощник по обновлению .NET обновил некоторые пакеты до новых версий. В примере приложения, предоставленного в этой статье, Microsoft.Data.Sqlite пакет NuGet был обновлен с версии 1.0.0 до 8.0.x. Однако 1.0.0 зависит от SQLite пакета NuGet, но 8.0.x удаляет эту зависимость. Пакет SQLite NuGet по-прежнему ссылается на проект, хотя он больше не требуется. Пакеты SQLiteSQLite.Native NuGet можно удалить из проекта.

  • Очистите старые пакеты NuGet.

    Файл packages.config больше не требуется и может быть удален из проекта, так как ссылки на пакеты NuGet теперь объявляются в файле проекта. Кроме того, локальная папка кэша пакетов NuGet с именем Packages находится в папке или родительской папке проекта. Эту папку локального кэша можно удалить. Новые ссылки на пакет NuGet используют глобальную папку кэша для пакетов, доступную в каталоге профилей пользователя с именем .nuget\packages.

  • Удалите библиотеку System.Configuration .

    Большинство приложений платформа .NET Framework ссылались на библиотекуSystem.Configuration. После обновления возможно, что эта библиотека по-прежнему ссылается непосредственно.

    Библиотека System.Configuration использует файл app.config для предоставления параметров конфигурации во время выполнения приложению. Для .NET эта библиотека была заменена пакетом System.Configuration.ConfigurationManager NuGet. Удалите ссылку на библиотеку и добавьте пакет NuGet в проект.

  • Проверьте места для модернизации приложения.

    API и библиотеки изменились довольно немного после выпуска .NET. В большинстве случаев платформа .NET Framework не имеют доступа к этим улучшениям. Обновив до .NET, теперь у вас есть доступ к более современным библиотекам.

    В следующих разделах описываются области модернизации примера приложения, используемого в этой статье.

Модернизация: элемент управления веб-браузером

Элемент WebBrowser управления, на который ссылается пример приложения WPF, основан на Обозреватель Интернета, который устарел. WPF для .NET может использовать элемент управления WebView2 на основе Microsoft Edge. Выполните следующие действия для обновления до нового WebView2 элемента управления веб-браузера:

  1. Добавление пакета NuGet Microsoft.Web.WebView2.

  2. В файле MainWindow.xaml:

    1. Импортируйте элемент управления в пространство имен 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">
      
    2. Вниз, где <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>
      
  3. Измените код 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 через System.Configuration.ConfigurationManager пакет NuGet, а поддержка appsettings.json предоставляется пакетом Microsoft.Extensions.Configuration NuGet.

По мере обновления других библиотек до .NET они модернизируются, поддерживая appsettings.json вместо App.config. Например, поставщики ведения журналов в платформа .NET Framework, которые были обновлены для .NET 6+, больше не используют App.config для параметров. Хорошо следовать их направлению, а также отходить от использования App.config , где можно.

Использование appsettings.json с примером приложения WPF

Например, после обновления примера приложения WPF используйте appsettings.json для строка подключения локальной базы данных.

  1. System.Configuration.ConfigurationManager Удалите пакет NuGet.

  2. Добавление пакета NuGet Microsoft.Extensions.Configuration.Json.

  3. Добавьте файл в проект с именем appsettings.json.

  4. Задайте файл appsettings.json для копирования в выходной каталог.

    Установите для копирования выходной параметр через Visual Studio с помощью окна свойств после выбора файла в Обозреватель решений. Кроме того, можно изменить проект напрямую и добавить следующее ItemGroup:

      <ItemGroup>
        <Content Include="appsettings.json">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </Content>
      </ItemGroup>
    
  5. Перенесите параметры в файл конфигурации App.config в новый файл appsettings.json .

    В примере приложения WPF файл app.config содержал только один строка подключения. Измените файл appsettings.json, чтобы определить строка подключения:

    {
      "ConnectionStrings": {
        "database": "DataSource=sqlite.db;"
      }
    }
    
  6. Измените файл 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();
            }
        }
    }
    
  7. В файле .\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 имен.