Jak uaktualnić aplikację klasyczną WPF do platformy .NET 8

W tym artykule opisano sposób uaktualniania aplikacji klasycznej windows Presentation Foundation (WPF) do platformy .NET 8. Mimo że WPF działa na platformie .NET, technologia międzyplatformowa, WPF jest nadal strukturą tylko dla systemu Windows. Następujące typy projektów związanych z platformą WPF można uaktualnić za pomocą Asystenta uaktualniania platformy .NET:

  • Projekt WPF
  • Biblioteka kontrolek
  • Biblioteka języka .NET

Jeśli przeprowadzasz uaktualnienie z programu .NET Framework do platformy .NET, zapoznaj się z artykułem Różnice w platformie .NET platformy WPF i przewodnikiem Przenoszenie z programu .NET Framework do platformy .NET .

Wymagania wstępne

Pokazowa aplikacja

Ten artykuł został napisany w kontekście uaktualniania przykładowego projektu Web Favorites Sample , który można pobrać z repozytorium GitHub przykłady platformy .NET.

Inicjowanie uaktualnienia

Jeśli uaktualniasz wiele projektów, zacznij od projektów, które nie mają zależności. W przykładzie Web Favorites (Ulubione sieci Web) projekt WebSiteRatings zależy od biblioteki StarVoteControl, więc najpierw należy uaktualnić element StarVoteControl.

Napiwek

Upewnij się, że masz kopię zapasową kodu, na przykład w kontroli źródła lub kopii.

Wykonaj następujące kroki, aby uaktualnić projekt w programie Visual Studio:

  1. Kliknij prawym przyciskiem myszy projekt StarVoteControl w oknie Eksplorator rozwiązań i wybierz polecenie Uaktualnij:

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

    Zostanie otwarta nowa karta z monitem o wybranie sposobu wykonania uaktualnienia.

  2. Wybierz pozycję Uaktualnienie projektu w miejscu.

  3. Następnie wybierz platformę docelową. W zależności od typu uaktualnianego projektu prezentowane są różne opcje. Platforma .NET Standard 2.0 jest dobrym wyborem, jeśli biblioteka nie korzysta z technologii klasycznej, takiej jak WPF, i może być używana zarówno przez projekty .NET Framework, jak i projekty platformy .NET. Jednak najnowsze wersje platformy .NET zapewniają wiele ulepszeń języka i kompilatora za pośrednictwem platformy .NET Standard.

    Wybierz pozycję .NET 8.0 , a następnie wybierz pozycję Dalej.

  4. Drzewo jest wyświetlane ze wszystkimi artefaktami powiązanymi z projektem, takimi jak pliki kodu i biblioteki. Możesz uaktualnić poszczególne artefakty lub cały projekt, który jest domyślny. Wybierz pozycję Uaktualnij wybór , aby rozpocząć uaktualnianie.

    Po zakończeniu uaktualniania zostaną wyświetlone wyniki:

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

    Artefakty z solidnym zielonym okręgiem zostały uaktualnione, podczas gdy pominięto puste zielone okręgi. Pominięte artefakty oznaczają, że asystent uaktualnienia nie znalazł niczego do uaktualnienia.

Po uaktualnieniu biblioteki pomocniczej aplikacji uaktualnij główną aplikację.

Uaktualnianie aplikacji

Po uaktualnieniu wszystkich bibliotek pomocniczych można uaktualnić główny projekt aplikacji. Wykonaj następujące kroki:

  1. Kliknij prawym przyciskiem myszy projekt WebSiteRatings w oknie Eksplorator rozwiązań i wybierz pozycję Uaktualnij:
  2. Wybierz pozycję Uaktualnienie projektu w miejscu jako tryb uaktualniania.
  3. Wybierz pozycję .NET 8.0 dla platformy docelowej, a następnie wybierz pozycję Dalej.
  4. Pozostaw zaznaczone wszystkie artefakty i wybierz pozycję Uaktualnij.

Po zakończeniu uaktualniania zostaną wyświetlone wyniki. Jeśli element ma symbol ostrzeżenia, oznacza to, że istnieje notatka do odczytania, którą można zrobić, rozwijając element.

Generowanie czystej kompilacji

Po uaktualnieniu projektu wyczyść go i skompiluj.

  1. Kliknij prawym przyciskiem myszy projekt WebSiteRatings w oknie Eksplorator rozwiązań i wybierz polecenie Wyczyść.
  2. Kliknij prawym przyciskiem myszy projekt WebSiteRatings w oknie Eksplorator rozwiązań i wybierz pozycję Kompiluj.

Jeśli aplikacja napotkała jakiekolwiek błędy, możesz je znaleźć w oknie Lista błędów z zaleceniem, jak je naprawić.

Kroki po uaktualnieniu

Jeśli projekt jest uaktualniany z programu .NET Framework do platformy .NET, zapoznaj się z informacjami w temacie Modernize po uaktualnieniu do platformy .NET z programu .NET Framework .

Po uaktualnieniu należy wykonać następujące elementy:

  • Sprawdź pakiety NuGet.

    Asystent uaktualniania platformy .NET uaktualnił niektóre pakiety do nowych wersji. W przypadku przykładowej aplikacji podanej w tym artykule Microsoft.Data.Sqlite pakiet NuGet został uaktualniony z wersji 1.0.0 do 8.0.x. Jednak 1.0.0 zależy SQLite od pakietu NuGet, ale 8.0.x usuwa tę zależność. Pakiet SQLite NuGet nadal odwołuje się do projektu, chociaż nie jest już wymagany. SQLite Pakiety i SQLite.Native NuGet można usunąć z projektu.

  • Wyczyść stare pakiety NuGet.

    Plik packages.config nie jest już wymagany i można go usunąć z projektu, ponieważ odwołania do pakietu NuGet są teraz zadeklarowane w pliku projektu. Ponadto lokalny folder pamięci podręcznej pakietów NuGet o nazwie Packages znajduje się w folderze lub folderze nadrzędnym projektu. Ten lokalny folder pamięci podręcznej można usunąć. Nowe odwołania do pakietu NuGet używają globalnego folderu pamięci podręcznej dla pakietów dostępnych w katalogu profilu użytkownika o nazwie .nuget\packages.

  • Usuń bibliotekę System.Configuration .

    Większość aplikacji .NET Framework odwołuje się do System.Configuration biblioteki. Po uaktualnieniu istnieje możliwość, że ta biblioteka jest nadal bezpośrednio przywołyowana.

    Biblioteka System.Configuration używa pliku app.config do udostępniania opcji konfiguracji czasu wykonywania aplikacji. W przypadku platformy .NET ta biblioteka została zastąpiona pakietem System.Configuration.ConfigurationManager NuGet. Usuń odwołanie do biblioteki i dodaj pakiet NuGet do projektu.

  • Sprawdź, czy nie ma miejsc do modernizacji aplikacji.

    Interfejsy API i biblioteki uległy zmianie od czasu wydania platformy .NET. W większości przypadków program .NET Framework nie ma dostępu do tych ulepszeń. Dzięki uaktualnieniu do platformy .NET masz teraz dostęp do bardziej nowoczesnych bibliotek.

    W następnych sekcjach opisano obszary modernizacji przykładowej aplikacji używanej w tym artykule.

Modernizowanie: kontrolka przeglądarki internetowej

Kontrolka WebBrowser , do której odwołuje się przykładowa aplikacja WPF, jest oparta na programie Internet Explorer, który jest nieaktualny. WPF dla platformy .NET może używać kontrolki WebView2 opartej na przeglądarce Microsoft Edge. Wykonaj następujące kroki, aby uaktualnić do nowej WebView2 kontrolki przeglądarki internetowej:

  1. Microsoft.Web.WebView2 Dodaj pakiet NuGet.

  2. W pliku MainWindow.xaml:

    1. Zaimportuj kontrolkę do przestrzeni nazw wpfControls w elemercie głównym:

      <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. W dół, <Border> gdzie element jest zadeklarowany, usuń kontrolkę WebBrowser i zastąp ją kontrolką 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. Edytuj kod MainWindow.xaml.cs pliku. Zaktualizuj metodę ListBox_SelectionChanged , aby ustawić browser.Source właściwość na prawidłową Uriwartość . Ten kod wcześniej przekazany w adresie URL witryny internetowej jako ciąg, ale kontrolka WebView2 wymaga .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>");
    }
    

W zależności od wersji systemu Windows uruchomionej przez użytkownika aplikacji może być konieczne zainstalowanie środowiska uruchomieniowego WebView2. Aby uzyskać więcej informacji, zobacz Get started with WebView2 in WPF apps (Wprowadzenie do aplikacji WebView2 w aplikacjach WPF).

Modernizuj: appsettings.json

Program .NET Framework używa pliku App.config do ładowania ustawień aplikacji, takich jak parametry połączenia i dostawcy rejestrowania. Platforma .NET używa teraz pliku appsettings.json dla ustawień aplikacji. Pliki App.config są obsługiwane na platformie .NET za pośrednictwem System.Configuration.ConfigurationManager pakietu NuGet, a obsługa appsettings.json jest zapewniana przez Microsoft.Extensions.Configuration pakiet NuGet.

W miarę uaktualniania innych bibliotek do platformy .NET modernizują się, obsługując appsettings.json zamiast App.config. Na przykład dostawcy rejestrowania w programie .NET Framework uaktualnionym dla platformy .NET 6+ nie używają już pliku App.config dla ustawień. Warto postępować zgodnie z ich kierunkiem, a także odejść od korzystania z pliku App.config , gdzie można.

Używanie appsettings.json z przykładową aplikacją WPF

Na przykład po uaktualnieniu przykładowej aplikacji WPF użyj appsettings.json dla parametry połączenia lokalnej bazy danych.

  1. System.Configuration.ConfigurationManager Usuń pakiet NuGet.

  2. Microsoft.Extensions.Configuration.Json Dodaj pakiet NuGet.

  3. Dodaj plik do projektu o nazwie appsettings.json.

  4. Ustaw plik appsettings.json, aby skopiować go do katalogu wyjściowego.

    Ustaw ustawienie kopiowania na dane wyjściowe za pomocą programu Visual Studio przy użyciu okna Właściwości po wybraniu pliku w Eksplorator rozwiązań. Alternatywnie możesz edytować projekt bezpośrednio i dodać następujący ItemGroupkod:

      <ItemGroup>
        <Content Include="appsettings.json">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </Content>
      </ItemGroup>
    
  5. Przeprowadź migrację ustawień w pliku App.config do nowego pliku appsettings.json .

    W przykładowej aplikacji WPF plik app.config zawierał tylko jeden parametry połączenia. Edytuj plik appsettings.json, aby zdefiniować parametry połączenia:

    {
      "ConnectionStrings": {
        "database": "DataSource=sqlite.db;"
      }
    }
    
  6. Edytuj plik App.xaml.cs, instancing obiektu konfiguracji, który ładuje plik appsettings.json, dodane wiersze są wyróżnione:

    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. W pliku .\Models\Database.cs zmień metodęOpenConnection, aby użyć nowej App.Config właściwości. Wymaga to zaimportowania Microsoft.Extensions.Configuration przestrzeni nazw:

    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 to metoda rozszerzenia dostarczana przez Microsoft.Extensions.Configuration przestrzeń nazw.