Actualización de una aplicación de escritorio de WPF a .NET 8

En este artículo se describe cómo actualizar una aplicación de escritorio de Windows Presentation Foundation (WPF) a .NET 8. Aunque WPF se ejecuta en .NET, una tecnología multiplataforma, WPF sigue siendo un marco solo de Windows. Los siguientes tipos de proyecto relacionados con WPF se pueden actualizar con el Asistente para actualización de .NET:

  • Proyecto de WPF
  • Biblioteca de controles
  • Biblioteca de .NET

Si va a actualizar de .NET Framework a .NET, considere la posibilidad de revisar el artículo Diferencias con .NET de WPF y la guía de migración de .NET Framework a .NET.

Requisitos previos

Aplicación de demostración

Este artículo se escribió en el contexto de la actualización del proyecto Ejemplo de favoritos web, que puede descargar del Repositorio de GitHub de ejemplos de .NET.

Iniciar la actualización

Si va a actualizar varios proyectos, comience con proyectos que no tengan dependencias. En el ejemplo Favoritos web, el proyecto WebSiteRatings depende de la biblioteca de StarVoteControl, por lo que StarVoteControl debe actualizarse primero.

Sugerencia

Asegúrese de tener una copia de seguridad del código, como en el control de código fuente o una copia.

Siga estos pasos para actualizar un proyecto en Visual Studio:

  1. Haga clic con el botón derecho en el proyecto StarVoteControl en la ventana del Explorador de soluciones y seleccione Actualizar:

    Elemento del menú Actualizar del Asistente para actualización de .NET en Visual Studio.

    Se abre una nueva pestaña que le pide que elija cómo desea que se realice la actualización.

  2. Seleccione Actualización local del proyecto.

  3. A continuación, seleccione la plataforma de destino. En función del tipo de proyecto que está actualizando, se presentan diferentes opciones. .NET Standard 2.0 es una buena opción si la biblioteca no se basa en una tecnología de escritorio como WPF y se puede usar en proyectos de .NET Framework y proyectos de .NET. Sin embargo, las versiones más recientes de .NET proporcionan muchas mejoras de lenguaje y compilador a través de .NET Standard.

    Seleccione .NET 8.0 y después, seleccione Siguiente.

  4. Se muestra un árbol con todos los artefactos relacionados con el proyecto, como archivos de código y bibliotecas. Puede actualizar artefactos individuales o todo el proyecto, que es el valor predeterminado. Seleccione Actualizar selección para iniciar la actualización.

    Una vez finalizada la actualización, se muestran los resultados:

    La pestaña Resultados de actualización del Asistente para actualización de .NET, que muestra 7 de los 21 elementos se omitieron.

    Los artefactos con un círculo verde sólido se actualizaron mientras se omitían círculos verdes vacíos. Los artefactos omitidos significan que el asistente de actualización no encontró nada que actualizar.

Ahora que se actualiza la biblioteca auxiliar de la aplicación, actualice la aplicación principal.

Actualizar la aplicación

Una vez actualizadas todas las bibliotecas auxiliares, se puede actualizar el proyecto de aplicación principal. Siga estos pasos:

  1. Haga clic con el botón derecho en el proyecto WebSiteRatings en la ventana Explorador de soluciones y seleccione Actualizar:
  2. Seleccione Actualización local del proyecto como modo de actualización.
  3. Seleccione .NET 8.0 para la plataforma de destino y seleccione Siguiente.
  4. Deje todos los artefactos seleccionados y seleccione Actualizar selección.

Una vez completada la actualización, se muestran los resultados. Si un elemento tiene un símbolo de advertencia, significa que hay una nota para que lea, lo que puede hacer expandiendo el elemento.

Generación de una compilación limpia

Después de actualizar el proyecto, limpie y compile el proyecto.

  1. Haga clic con el botón derecho en el proyecto WebSiteRatings en la ventana Explorador de soluciones y seleccione Limpiar.
  2. Haga clic con el botón derecho en el proyecto WebSiteRatings en la ventana Explorador de soluciones y seleccione Compilar.

Si la aplicación encontró algún error, puede encontrarlos en la ventana Lista de errores con una recomendación sobre cómo corregirlas.

Pasos posteriores a la actualización

Si el proyecto se está actualizando de .NET Framework a .NET, revise la información del artículo Modernización después de actualizar a .NET desde .NET Framework.

Después de actualizar, querrá:

  • Compruebe los paquetes NuGet.

    El Asistente para actualización de .NET actualizó algunos paquetes a nuevas versiones. Con la aplicación de ejemplo proporcionada en este artículo, el Microsoft.Data.SqlitePaquete NuGet se actualizó de 1.0.0 a 8.0.x. Sin embargo, 1.0.0 depende del SQLitepaquete NuGet, pero 8.0.x quita esa dependencia. El proyecto sigue haciendo referencia al paquete NuGet SQLite, aunque ya no es necesario. Tanto el SQLite y SQLite.Native paquetes NuGet se pueden quitar del proyecto.

  • Limpie los paquetes NuGet antiguos.

    El archivo packages.config ya no es necesario y se puede eliminar del proyecto, ya que las referencias del paquete NuGet ahora se declaran en el archivo del proyecto. Además, la carpeta de caché de paquetes NuGet local, denominada Paquetes, se encuentra en la carpeta o en la carpeta principal del proyecto. Esta carpeta de caché local se puede eliminar. Las nuevas referencias del paquete NuGet usan una carpeta de caché global para los paquetes, disponible en el directorio de perfiles del usuario, denominada .nuget\packages.

  • Quite la biblioteca System.Configuration.

    La mayoría de las aplicaciones de .NET Framework hacen referencia a la bibliotecaSystem.Configuration. Después de actualizar, es posible que todavía se haga referencia a esta biblioteca directamente.

    La System.Configuration biblioteca usa el archivo app.config para proporcionar opciones de configuración en tiempo de ejecución a la aplicación. Para .NET, esta biblioteca se ha reemplazado por el paquete NuGet System.Configuration.ConfigurationManager. Quite la referencia a la biblioteca y agregue el paquete NuGet al proyecto.

  • Busque lugares para modernizar la aplicación.

    Las API y las bibliotecas han cambiado bastante desde que se publicó .NET. Y en la mayoría de los casos, .NET Framework no tiene acceso a estas mejoras. Al actualizar a .NET, ahora tiene acceso a bibliotecas más modernas.

    En las secciones siguientes se describen las áreas que moderniza la aplicación de ejemplo que usa este artículo.

Modernización: control de explorador web

El control WebBrowser al que hace referencia la aplicación de ejemplo de WPF se basa en Internet Explorer, que no está actualizado. WPF para .NET puede usar el control WebView2 basado en Microsoft Edge. Complete los pasos siguientes para actualizar al nuevo control de explorador web WebView2:

  1. Agregue el paquete NuGet Microsoft.Web.WebView2.

  2. En el archivo MainWindow.xaml:

    1. Importe el control al espacio de nombres wpfControls en el elemento raíz:

      <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. Abajo, donde se declara el elemento <Border>, quite el control WebBrowser y reemplácelo por el control 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. Edite el archivo de código subyacente MainWindow.xaml.cs. Actualice el método ListBox_SelectionChanged para establecer la propiedad browser.Source en una clase Uri válida. Este código se pasó anteriormente en la dirección URL del sitio web como una cadena, pero el control WebView2 nuevo requiere una clase 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>");
    }
    

En función de la versión de Windows que ejecute un usuario de la aplicación, es posible que deba instalar el entorno de ejecución WebView2. Para obtener más información, consulte Introducción a WebView2 en aplicaciones WPF.

Modernización: appsettings.json

.NET Framework usa el archivo App.config para cargar la configuración de la aplicación, como cadenas de conexión y proveedores de registro. .NET ahora usa el archivo appsettings.json para la configuración de la aplicación. Los archivos App.config se admiten en .NET a través del paquete NuGet System.Configuration.ConfigurationManager y el paquete NuGet Microsoft.Extensions.Configuration proporciona compatibilidad con appsettings.json.

A medida que otras bibliotecas se actualizan a .NET, se modernizarán mediante la compatibilidad con appsettings.json en lugar de App.config. Por ejemplo, los proveedores de registro de .NET Framework que se han actualizado para .NET 6 ya no usan App.config para la configuración. Es bueno seguir su dirección y también alejarse del uso de App.config donde pueda.

Uso de appsettings.json con la aplicación de ejemplo de WPF

Por ejemplo, después de actualizar la aplicación de ejemplo de WPF, use appsettings.json para la cadena de conexión a la base de datos local.

  1. Quite el paquete NuGet System.Configuration.ConfigurationManager.

  2. Agregue el paquete NuGet Microsoft.Extensions.Configuration.Json.

  3. Agregue un archivo al proyecto denominado appsettings.json.

  4. Establezca el archivo appsettings.json para copiarlo en el directorio de salida.

    Establezca la copia en la configuración de salida a través de Visual Studio mediante la ventana Propiedades después de seleccionar el archivo en el Explorador de soluciones. Como alternativa, puede editar el proyecto directamente y agregar los siguientes ItemGroup:

      <ItemGroup>
        <Content Include="appsettings.json">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </Content>
      </ItemGroup>
    
  5. Migre la configuración del archivo App.config a un nuevo archivo appsettings.json.

    En la aplicación de ejemplo de WPF, app.config solo contenía una sola cadena de conexión. Edite el archivo appsettings.json para definir la cadena de conexión:

    {
      "ConnectionStrings": {
        "database": "DataSource=sqlite.db;"
      }
    }
    
  6. Edite el archivo App.xaml.cs, instando un objeto de configuración que carga el archivo appsettings.json, se resaltan las líneas agregadas:

    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. En el archivo .\Models\Database.cs, cambie el método OpenConnection para usar la propiedad App.Config nueva. Esto requiere la importación del espacio de nombres 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 es un método de extensión proporcionado por el espacio de nombres Microsoft.Extensions.Configuration.