Udostępnij za pośrednictwem


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 .NET

Jeśli przeprowadzasz uaktualnienie z programu .NET Framework do platformy .NET, zapoznaj się z artykułem Differences with WPF .NET and the Porting from .NET Framework to .NET guide (Różnice z platformy .NET Framework na platformę .NET).

Warunki wstępne

Pokazowa aplikacja

Ten artykuł został napisany w kontekście uaktualniania projektu przykładowych ulubionych sieci Web , który można pobrać z repozytorium GitHub przykładów 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, dlatego najpierw należy zaktualizować StarVoteControl.

Napiwek

Upewnij się, że masz kopię zapasową swojego kodu, na przykład w systemie kontroli wersji lub w osobnej kopii.

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

  1. Kliknij prawym przyciskiem myszy projekt StarVoteControl w oknie Eksploratora rozwiązań , a następnie wybierz pozycję Uaktualnij:

    pozycja menu Uaktualnianie w Asystencie uaktualniania .NET w programie Visual Studio.

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

  2. Wybierz uaktualnienie projektu na miejscu .

  3. Następnie wybierz platformę docelową. W zależności od typu uaktualnianego projektu prezentowane są różne opcje. .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 .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 Opcję aktualizacji, aby rozpocząć aktualizację.

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

    karta wyników uaktualnienia narzędzia .NET Upgrade Assistant, pokazuje, że 7 z 21 elementów zostało pominiętych.

    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 Eksploratora Rozwiązań, a następnie wybierz pozycję Zaktualizuj:
  2. Wybierz Uaktualnienie projektu w miejscu jako tryb uaktualniania.
  3. Wybierz .NET 8.0 dla platformy docelowej i wybierz Dalej.
  4. Pozostaw zaznaczone wszystkie artefakty i wybierz pozycję Uaktualnij wybór.

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

Generowanie czystej kompilacji

Po uaktualnieniu projektu wyczyść go i skompiluj.

  1. Kliknij prawym przyciskiem myszy projekt WebSiteRatings w Solution Explorer i wybierz pozycję Clean.
  2. Kliknij prawym przyciskiem myszy projekt WebSiteRatings w oknie Eksplorator rozwiązań Solution Explorer i wybierz pozycję Build.

Jeśli aplikacja napotkała jakiekolwiek błędy, możesz je znaleźć w oknie listy 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 artykule Modernize po uaktualnieniu do platformy .NET z programu .NET Framework.

Po uaktualnieniu warto zrobić następujące rzeczy:

  • Sprawdź pakiety NuGet.

    Asystent uaktualniania platformy .NET uaktualnił niektóre pakiety do nowych wersji. W przykładowej aplikacji podanej w tym artykule pakiet NuGet Microsoft.Data.Sqlite został uaktualniony z 1.0.0 do 8.0.x. Jednak 1.0.0 zależy od pakietu NuGet SQLite, ale 8.0.x usuwa tę zależność. Projekt nadal odwołuje się do pakietu NuGet SQLite, chociaż nie jest już wymagany. Pakiety NuGet SQLite i SQLite.Native 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 folder lokalnej pamięci podręcznej pakietów NuGet, nazwany Packages, znajduje się w folderze projektu lub w jego katalogu nadrzędnym. 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 biblioteki System.Configuration. 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 w czasie wykonywania aplikacji. W przypadku platformy .NET ta biblioteka została zastąpiona przez pakiet NuGet System.Configuration.ConfigurationManager. 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.

Modernizacja: kontrola 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. Aby uaktualnić do nowej wersji kontrolki przeglądarki internetowej WebView2, wykonaj następujące kroki:

  1. Dodaj pakiet Microsoft.Web.WebView2 NuGet.

  2. W pliku MainWindow.xaml:

    1. Zaimportuj kontrolkę do wpfControls przestrzeni nazw w elemencie 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ół, gdzie zadeklarowany jest element <Border>, 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ć właściwość browser.Source na prawidłową Uri. Ten kod był przekazywany w formie ciągu znaków w adresie URL strony internetowej, ale kontrola 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 Wprowadzenie do usługi 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 pakietu NuGet System.Configuration.ConfigurationManager, a obsługa appsettings.json jest zapewniana przez pakiet NuGet Microsoft.Extensions.Configuration.

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

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

Na przykład po uaktualnieniu przykładowej aplikacji WPF użyj appsettings.json dla parametrów połączenia z lokalną bazą danych.

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

  2. Dodaj pakiet Microsoft.Extensions.Configuration.Json 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 Eksploratorze rozwiązań . Alternatywnie możesz edytować projekt bezpośrednio i dodać następujący ItemGroup:

      <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 app.config zawierał tylko jeden parametr połączenia. Edytuj plik appsettings.json, aby zdefiniować parametry połączenia:

    {
      "ConnectionStrings": {
        "database": "DataSource=sqlite.db;"
      }
    }
    
  6. Edytuj plik App.xaml.cs, tworząc obiekt konfiguracji, który ładuje plik appsettings.json, a 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 właściwości App.Config. Wymaga to zaimportowania przestrzeni nazw 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 to metoda rozszerzenia dostarczana przez przestrzeń nazw Microsoft.Extensions.Configuration.