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
- Sistema operativo Windows
- Visual Studio 2022, versión 17.7 o posterior, para tener como destino .NET 8
- Visual Studio 2022, versión 17.1 o posterior, para tener como destino .NET 7
- Extensión del Asistente para actualización de .NET para Visual Studio
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:
Haga clic con el botón derecho en el proyecto StarVoteControl en la ventana del Explorador de soluciones y seleccione Actualizar:
Se abre una nueva pestaña que le pide que elija cómo desea que se realice la actualización.
Seleccione Actualización local del proyecto.
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.
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:
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:
- Haga clic con el botón derecho en el proyecto WebSiteRatings en la ventana Explorador de soluciones y seleccione Actualizar:
- Seleccione Actualización local del proyecto como modo de actualización.
- Seleccione .NET 8.0 para la plataforma de destino y seleccione Siguiente.
- 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.
- Haga clic con el botón derecho en el proyecto WebSiteRatings en la ventana Explorador de soluciones y seleccione Limpiar.
- 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.Sqlite
Paquete NuGet se actualizó de 1.0.0 a 8.0.x. Sin embargo, 1.0.0 depende delSQLite
paquete NuGet, pero 8.0.x quita esa dependencia. El proyecto sigue haciendo referencia al paquete NuGetSQLite
, aunque ya no es necesario. Tanto elSQLite
ySQLite.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 biblioteca
System.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 NuGetSystem.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:
Agregue el paquete NuGet
Microsoft.Web.WebView2
.En el archivo MainWindow.xaml:
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">
Abajo, donde se declara el elemento
<Border>
, quite el controlWebBrowser
y reemplácelo por el controlwpfControls: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>
Edite el archivo de código subyacente MainWindow.xaml.cs. Actualice el método
ListBox_SelectionChanged
para establecer la propiedadbrowser.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 claseUri
.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.
Quite el paquete NuGet
System.Configuration.ConfigurationManager
.Agregue el paquete NuGet
Microsoft.Extensions.Configuration.Json
.Agregue un archivo al proyecto denominado appsettings.json.
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>
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;" } }
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(); } } }
En el archivo .\Models\Database.cs, cambie el método
OpenConnection
para usar la propiedadApp.Config
nueva. Esto requiere la importación del espacio de nombresMicrosoft.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 nombresMicrosoft.Extensions.Configuration
.
.NET Desktop feedback