Actualización manual de una aplicación Xamarin.Forms a una aplicación .NET MAUI de proyecto único
Para migrar una aplicación Xamarin.Forms a una aplicación de .NET Multi-platform App UI (.NET MAUI) de proyecto único, debes hacer lo siguiente:
- Actualiza la aplicación Xamarin.Forms para usar Xamarin.Forms 5.
- Actualiza todas las dependencias de la aplicación a las versiones más recientes.
- Asegúrate de que la aplicación sigue funcionando.
- Cree una aplicación .NET MAUI.
- Copia el código y la configuración de la aplicación Xamarin.Forms en la aplicación .NET MAUI.
- Copia los recursos de la aplicación Xamarin.Forms en la aplicación .NET MAUI.
- Actualiza los espacios de nombres
- Soluciona los cambios de API.
- Actualiza o reemplaza las dependencias incompatibles con versiones de .NET 8.
- Compila y prueba la aplicación.
Para simplificar el proceso de actualización, debes crear una nueva aplicación .NET MAUI con el mismo nombre que la aplicación Xamarin.Forms y, después, copiar en el código, la configuración y los recursos. Este es el método que se describe a continuación.
Actualiza tu aplicación Xamarin.Forms
Antes de actualizar la aplicación Xamarin.Forms a .NET MAUI, primero debes actualizar la aplicación Xamarin.Forms para usar Xamarin.Forms 5 y asegurarte de que todavía se ejecuta correctamente. Además, debes actualizar las dependencias que usa la aplicación a las versiones más recientes.
Esto ayudará a simplificar el resto del proceso de migración, ya que minimizará las diferencias de API entre Xamarin.Forms y .NET MAUI y garantizará que estás usando versiones compatibles con .NET de las dependencias si existen.
Crear una aplicación .NET MAUI
En Visual Studio, crea una aplicación .NET MAUI con el mismo nombre que la aplicación Xamarin.Forms:
Al abrir el archivo del proyecto, se confirmará que tienes un proyecto de estilo SDK de .NET.
Copia del código en la aplicación de .NET MAUI
Todo el código multiplataforma del proyecto de biblioteca Xamarin.Forms debe copiarse en el proyecto de aplicación de .NET MAUI en carpetas y archivos con nombre idéntico.
Los representadores personalizados se pueden reutilizar en una aplicación de .NET MAUI o migrar a un controlador de .NET MAUI. Para obtener más información, consulta Reutilización de representadores personalizados en .NET MAUI y Migración de un representador personalizado Xamarin.Forms a un controlador de .NET MAUI.
Los efectos se pueden reutilizar en una aplicación de .NET MAUI. Para obtener más información, consulta Reutilización de efectos.
Nota:
Puede actualizar rápidamente losXamarin.Forms
espacios de nombres aMicrosoft.Maui
mediante acciones rápidas en Visual Studio, siempre que haya instalado Asistente de actualización.
Código específico de la plataforma
Un proyecto de aplicación .NET MAUI contiene una carpeta Plataforms en la que cada carpeta secundaria representa una plataforma que .NET MAUI puede tener como destino.
Las carpetas de cada plataforma contienen recursos específicos de la plataforma y el código que inicia la aplicación en cada plataforma:
El código, y las carpetas que lo contienen, de tus proyectos principales Xamarin.Forms deben copiarse en estas carpetas:
El código de tu proyecto principal de Android Xamarin.Forms debe copiarse en la carpeta Platform\Android de tu proyecto de aplicación de .NET MAUI. Además, copia cualquier código personalizado de tus clases Xamarin.Forms
MainActivity
yMainApplication
en las mismas clases de tu proyecto de aplicación de .NET MAUI.El código de tu proyecto principal de Xamarin.Forms iOS debe copiarse en la carpeta Platforms\iOS de tu proyecto de aplicación de .NET MAUI. Además, copia cualquier código personalizado de tu clase Xamarin.Forms
AppDelegate
en la misma clase de tu proyecto de aplicación de .NET MAUI.Nota:
Para obtener una lista de los cambios importantes en .NET para iOS, consulte Cambios importantes en .NET para iOS.
El código de tu proyecto principal de UWP Xamarin.Forms debe copiarse en la carpeta Plataforms\Windows de tu proyecto de aplicación de .NET MAUI. Además, copia cualquier código personalizado de tu clase Xamarin.Forms
App
en la misma clase de tu proyecto de aplicación de .NET MAUI.
En tiempo de compilación, el sistema de compilación solo incluye el código de cada carpeta al compilar para esa plataforma específica. Por ejemplo, al compilar para Android, los archivos de la carpeta Plataformas\Android se integrarán en el paquete de la aplicación, pero no los archivos de las demás carpetas Plataformas. Este enfoque usa una característica denominada múltiples versiones que pretende tener como destino varias plataformas desde un único proyecto. Las aplicaciones de .NET MAUI también pueden tener varios destinos en función de sus propios criterios de nombre de archivo y carpeta. Esto te permite estructurar el proyecto de aplicación de .NET MAUI para que no tengas que colocar tu código de la plataforma en carpetas secundarias de la carpeta Plataforms. Para obtener más información, consulta Configuración de varios destinos.
Copia de la configuración en la aplicación de .NET MAUI
Cada plataforma usa su propio archivo de manifiesto de aplicación nativa para especificar información como el título de la aplicación, el identificador, la versión, etc. El proyecto único de .NET MAUI permite especificar estos datos comunes de la aplicación en una sola ubicación en el archivo del proyecto.
Para especificar los datos del manifiesto de la aplicación compartida para un proyecto, en el Explorador de soluciones, abre el menú contextual del proyecto y, luego, elige Propiedades. El título, el identificador y la versión de la aplicación se pueden especificar en MAUI Shared > General:
En tiempo de compilación, los datos del manifiesto de la aplicación compartida se combinan con datos específicos de la plataforma en el archivo de manifiesto de aplicación nativa, para generar el archivo de manifiesto para el paquete de la aplicación. Para obtener más información, consulta Configuración de proyectos en .NET MAUI: MAUI compartido.
Los datos restantes de los manifiestos de la aplicación Xamarin.Forms deben copiarse en el manifiesto de la aplicación de .NET MAUI:
- En Android, copia los datos adicionales del archivo AndroidManifest.xml en el proyecto principal de Android Xamarin.Forms, en el archivo Platforms\Android\AndroidManifest.xml del proyecto de aplicación de .NET MAUI
- En iOS, copia los datos adicionales del archivo Info.plist en el proyecto principal de iOS Xamarin.Forms, en el archivo Platforms\iOS\Info.plist del proyecto de aplicación de .NET MAUI. Además, copia el archivo Entitlements.plist en el proyecto principal de iOS Xamarin.Forms en la carpeta Platforms\iOS del proyecto de aplicación de .NET MAUI.
- En Windows, copia datos adicionales del archivo Package.appxmanifest en el proyecto principal de UWP Xamarin.Forms, en el archivo Platforms\Windows\Package.appxmanifest en el proyecto de aplicación de .NET MAUI.
Copia los recursos a la aplicación de .NET MAUI
El proyecto único .NET MAUI permite almacenar archivos de recursos en una sola ubicación mientras se consumen en cada plataforma. Esto incluye fuentes, imágenes, el icono de la aplicación, la pantalla de presentación, los recursos sin procesar y los archivos CSS para aplicar estilos a aplicaciones .NET MAUI.
Normalmente, los archivos de recursos deben colocarse en la carpeta Resources del proyecto de aplicación de .NET MAUI o en las carpetas secundarias de la carpeta Resources y deben tener la acción de compilación establecida correctamente. En la tabla siguiente se muestran las acciones de compilación para cada tipo de archivo de recurso:
Resource | Acción de compilación |
---|---|
Icono de aplicación | MauiIcon |
Fuentes | MauiFont |
Imágenes | MauiImage |
Pantalla de presentación | MauiSplashScreen |
Recursos sin procesar | MauiAsset |
CSS archivos | MauiCss |
Nota:
Los archivos XAML también se almacenan en el proyecto de aplicación de .NET MAUI y se les asigna automáticamente la acción de compilación MauiXaml. Sin embargo, solo los diccionarios de recursos XAML se colocarán, por lo general, en la carpeta Resources del proyecto de la aplicación.
En la captura de pantalla siguiente se muestra una carpeta Resources típica que contiene carpetas secundarias para cada tipo de recurso:
La acción de compilación de un archivo de recursos se establecerá correctamente si el recurso se ha agregado a la carpeta secundaria Resources correcta.
Importante
Los recursos específicos de la plataforma reemplazarán a sus recursos compartidos homólogos. Por ejemplo, si tiene una imagen específica de Android ubicada en Platforms\Android\Resources\drawable-xhdpi\logo.png, y también proporciona una imagen compartida Resources\Images\logo.svg, el archivo de Gráficos vectoriales escalables (SVG) se usará para generar las imágenes de Android necesarias, excepto para la imagen XHDPI que ya existe como una imagen específica de la plataforma.
Iconos de aplicación
Tu icono de aplicación Xamarin.Forms debe agregarse al proyecto de aplicación de .NET MAUI arrastrando la imagen a la carpeta Resources\AppIcon del proyecto, donde su acción de compilación se establecerá automáticamente en MauiIcon. Durante la compilación, el icono de la aplicación se cambia de tamaño a los tamaños correctos de la plataforma y el dispositivo de destino. Los iconos de la aplicación se cambian de tamaño a varias resoluciones porque tienen varios usos, incluidos los que se usan para representar la aplicación en el dispositivo y en la tienda de aplicaciones.
Para obtener más información, consulta Agregar un icono de aplicación aun proyecto de aplicación de .NET MAUI.
Pantalla de presentación
Si tu aplicación Xamarin.Forms tiene una pantalla de presentación, debes agregarla a tu proyecto de aplicación de .NET MAUI arrastrando la imagen a la carpeta Resources\Splash del proyecto, donde su acción de compilación se establecerá automáticamente en MauiSplashScreen. Durante la compilación, la imagen de la pantalla de presentación cambia de tamaño al tamaño correcto para la plataforma y el dispositivo de destino.
Para obtener más información, consulta Agregar una pantalla de presentación a un proyecto de aplicación de .NET MAUI.
Imágenes
Los dispositivos tienen una gama de tamaños y densidades de pantalla y cada plataforma móvil tiene funcionalidad para mostrar imágenes dependientes de la densidad. En Xamarin.Forms, las imágenes que dependen de la densidad suelen colocarse en proyectos principales y adoptan una convención de nomenclatura específica de la plataforma. Hay dos enfoques que se pueden adoptar para migrar estas imágenes a .NET MAUI.
El enfoque recomendado es copiar la versión de resolución más alta de cada imagen de tu solución Xamarin.Forms al proyecto de la aplicación .NET MAUI arrastrándolo hasta la carpeta Resources\Images del proyecto, donde su acción de compilación se establecerá automáticamente en MauiImage. También será necesario establecer el atributo BaseSize
de cada imagen de mapa de bits para asegurar que se produce el cambio de tamaño. Esto elimina la necesidad de tener varias versiones de cada imagen en cada plataforma. En tiempo de compilación, las imágenes se cambiarán a varias imágenes dependientes de la densidad que cumplan los requisitos de la plataforma. Para obtener más información, consulta Adición de imágenes a un proyecto de aplicación .NET MAUI.
Como alternativa, puedes copiar imágenes dependientes de la densidad de la solución Xamarin.Forms en carpetas con nombre idéntico en la carpeta Platforms\{Platform} del proyecto de aplicación de .NET MAUI y establecer sus acciones de compilación en las acciones de compilación que se usan en la solución Xamarin.Forms. En la tabla siguiente se enumeran las ubicaciones de imágenes de ejemplo de una solución Xamarin.Forms y su ubicación equivalente en un proyecto de aplicación de .NET MAUI:
Ubicación de las imágenes en Xamarin.Forms | Ubicación de las imágenes en .NET MAUI | Acción de compilación de imágenes de la plataforma .NET MAUI |
---|---|---|
{MyApp.Android}\Resources\drawable-xhdpi\image.png | Platforms\Android\Resources\drawable-xhdpi\image.png | AndroidResource |
{MyApp.iOS}\image.jpg | *Platforms\iOS\Resources\image.jpg | BundleResource |
{MyApp.UWP}\Assets\Images\image.gif | *Platforms\Windows\Assets\Images\image.gif | Contenido |
Siempre que hayas adoptado la misma convención de nomenclatura de imágenes que usaste en la solución Xamarin.Forms, se elegirá la imagen adecuada en tiempo de ejecución según las funcionalidades del dispositivo. La desventaja de este enfoque es que sigues teniendo varias versiones de cada imagen en cada plataforma.
Fuentes
Las fuentes de la solución Xamarin.Forms se pueden agregar a la solución de .NET MAUI arrastrándolas a la carpeta Resources\Fonts del proyecto de aplicación de .NET MAUI, donde su acción de compilación se establecerá automáticamente en MauiFont.
Para obtener más información, consulta Fuentes.
CSS archivos
Los archivos CSS de la solución Xamarin.Forms se pueden agregar a la solución de .NET MAUI arrastrándolos a una carpeta con nombre idéntico y estableciendo su acción de compilación en MauiCss en la ventana Propiedades.
Para obtener más información sobre cómo usar los archivos CSS en una aplicación .NET MAUI, consulta Aplicar estilo a las aplicaciones mediante hojas de estilos en cascada.
Recursos sin procesar
Los archivos de recursos sin procesar, como HTML, JSON y vídeo, deben copiarse de la solución Xamarin.Forms en el proyecto de aplicación .NET MAUI arrastrándolos a la carpeta Resources\Raw del proyecto, donde su acción de compilación se establecerá automáticamente en MauiAsset.
Recursos localizados
En una aplicación .NET MAUI, las cadenas se localizan con el mismo enfoque que en una aplicación Xamarin.Forms. Por lo tanto, los archivos de recursos de .NET (.resx) deben copiarse de la solución Xamarin.Forms en una carpeta con nombre idéntico en la solución de .NET MAUI. Luego se debe especificar el idioma neutro de la aplicación .NET MAUI. Para obtener más información, consulta Especificar el idioma neutro de la aplicación.
Nota:
Los archivos de recursos de .NET no tienen que colocarse en la carpeta Resources del proyecto de aplicación de .NET MAUI.
En una aplicación .NET MAUI, las imágenes se localizan con el mismo enfoque que en una aplicación Xamarin.Forms. Por lo tanto, las imágenes localizadas y las carpetas en las que residen deben copiarse de la solución Xamarin.Forms en el proyecto de aplicación .NET MAUI:
- En Android, la carpeta raíz del proyecto de aplicación .NET MAUI para las imágenes localizadas es Platforms\Android\Resources.
- En iOS, la carpeta raíz del proyecto de aplicación .NET MAUI para las imágenes localizadas es Platforms\iOS\Resources.
- En Windows, la carpeta raíz del proyecto de aplicación .NET MAUI para las imágenes localizadas es Platforms\Windows\Assets\Images.
Las imágenes localizadas deben tener sus acciones de compilación establecidas en las acciones de compilación que se usan en la solución Xamarin.Forms. Para obtener más información, consulta Localización de imágenes.
En una aplicación .NET MAUI, los nombres de aplicación se localizan con el mismo enfoque que en una aplicación Xamarin.Forms:
- En Android, el nombre de la aplicación localizada se puede almacenar mediante una convención de nomenclatura basada en carpetas en la carpeta Platforms\Android\Resources. Las carpetas y los archivos de localización de nombres de aplicación deben copiarse en esta carpeta de la solución Xamarin.Forms.
- En iOS, el nombre de la aplicación localizada se almacena mediante una convención de nomenclatura basada en carpetas en la carpeta Platforms\iOS\Resources. Las carpetas y los archivos de localización de nombres de aplicación deben copiarse en esta carpeta de la solución Xamarin.Forms.
- En Windows, el nombre de la aplicación localizada se almacena en el manifiesto del paquete de la aplicación.
Para obtener más información, consulta Localizar el nombre de la aplicación. Para obtener más información sobre la localización de la aplicación .NET MAUI, consulta Localización.
Cambios en el espacio de nombres
Los espacios de nombres han cambiado al pasar de Xamarin.Forms a .NET MAUI y Xamarin.Essentials las características ahora forman parte de .NET MAUI. Para realizar actualizaciones de espacios de nombres, realiza una búsqueda y una sustitución para los siguientes espacios de nombres:
Los proyectos de .NET MAUI usan directivas global using
implícitas. Esta característica permite quitar directivas using
para el espacio de nombres Xamarin.Essentials
, sin tener que reemplazarlas por los espacios de nombres de .NET MAUI equivalentes.
Además, el espacio de nombres de XAML predeterminado ha cambiado de http://xamarin.com/schemas/2014/forms
en Xamarin.Forms a http://schemas.microsoft.com/dotnet/2021/maui
en .NET MAUI. Por lo tanto, debes reemplazar todas las apariciones de xmlns="http://xamarin.com/schemas/2014/forms"
por xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
.
Nota:
Puede actualizar rápidamente losXamarin.Forms
espacios de nombres aMicrosoft.Maui
mediante acciones rápidas en Visual Studio, siempre que haya instalado Asistente de actualización.
Cambios de API
Algunas API han cambiado al pasar de Xamarin.Forms a .NET MAUI. Esta se debe a varias razones, incluida la eliminación de la funcionalidad duplicada causada al convertirse Xamarin.Essentials en parte de .NET MAUI y al asegurarse de que las API siguen las directrices de nomenclatura de .NET. En las secciones siguientes se describen estos cambios.
Cambios de color
En Xamarin.Forms, la estructura Xamarin.Forms.Color
te permite construir objetos Color mediante valores double
y proporciona colores con nombre, como Xamarin.Forms.Color.AliceBlue
. En .NET MAUI, esta funcionalidad se ha separado en la clase Microsoft.Maui.Graphics.Color y en la clase Microsoft.Maui.Graphics.Colors.
La clase Microsoft.Maui.Graphics.Color, en el espacio de nombres Microsoft.Maui.Graphics, permite construir objetos Color mediante valores float
, valores byte
y valores int
. La clase Microsoft.Maui.Graphics.Colors, que también se encuentra en el espacio de nombres Microsoft.Maui.Graphics, proporciona en gran medida los mismos colores con nombre. Por ejemplo, use Colors.AliceBlue para especificar el color AliceBlue
.
En la tabla siguiente se muestran los cambios de API entre la estructura Xamarin.Forms.Color
y la clase Microsoft.Maui.Graphics.Color:
API Xamarin.Forms | API .NET MAUI | Comentario |
---|---|---|
Xamarin.Forms.Color.R |
Microsoft.Maui.Graphics.Color.Red | |
Xamarin.Forms.Color.G |
Microsoft.Maui.Graphics.Color.Green | |
Xamarin.Forms.Color.B |
Microsoft.Maui.Graphics.Color.Blue | |
Xamarin.Forms.Color.A |
Microsoft.Maui.Graphics.Color.Alpha | |
Xamarin.Forms.Color.Hue |
Microsoft.Maui.Graphics.Color.GetHue | Propiedad Xamarin.Forms reemplazada por un método en .NET MAUI. |
Xamarin.Forms.Color.Saturation |
Microsoft.Maui.Graphics.Color.GetSaturation | Propiedad Xamarin.Forms reemplazada por un método en .NET MAUI. |
Xamarin.Forms.Color.Luminosity |
Microsoft.Maui.Graphics.Color.GetLuminosity | Propiedad Xamarin.Forms reemplazada por un método en .NET MAUI. |
Xamarin.Forms.Color.Default |
No hay equivalente de .NET MAUI. En su lugar, el valor predeterminado para objetos Microsoft.Maui.Graphics.Color es null . |
|
Xamarin.Forms.Color.Accent |
No hay equivalente de .NET MAUI. | |
Xamarin.Forms.Color.FromHex |
Microsoft.Maui.Graphics.Color.FromArgb | Microsoft.Maui.Graphics.Color.FromHex es obsoleto y se eliminará en una próxima versión. |
Además, todos los valores numéricos de Microsoft.Maui.Graphics.Color son float
, en lugar de double
como se usa en Xamarin.Forms.Color
.
Nota:
A diferencia de Xamarin.Forms, un Microsoft.Maui.Graphics.Color no tiene una conversión implícita a System.Drawing.Color.
Cambios de diseño
En la tabla siguiente se enumeran las API de diseño que se han quitado en el traslado de Xamarin.Forms a .NET MAUI:
API Xamarin.Forms | API .NET MAUI | Comentarios |
---|---|---|
Xamarin.Forms.AbsoluteLayout.IAbsoluteList<T>.Add |
La sobrecarga de Add que acepta 3 argumentos no está presente en .NET MAUI. |
|
Xamarin.Forms.Grid.IGridList<T>.AddHorizontal |
No hay equivalente de .NET MAUI. | |
Xamarin.Forms.Grid.IGridList<T>.AddVertical |
No hay equivalente de .NET MAUI. | |
Xamarin.Forms.RelativeLayout |
Microsoft.Maui.Controls.Compatibility.RelativeLayout | En .NET MAUI, RelativeLayout solo existe como control de compatibilidad para los usuarios que migran desde Xamarin.Forms. Usa Grid en su lugar o agrega xmlns al espacio de nombres de compatibilidad. |
Además, agregar elementos secundarios a un diseño en el código en Xamarin.Forms se logra agregando los elementos secundarios a la colección Children
del diseño:
Grid grid = new Grid();
grid.Children.Add(new Label { Text = "Hello world" });
En .NET MAUI, la colección Children es para uso interno de .NET MAUI y no debe manipularse directamente. Por lo tanto, en el código, los elementos secundarios se deben agregar directamente al diseño:
Grid grid = new Grid();
grid.Add(new Label { Text = "Hello world" });
Importante
Los métodos de extensión de diseño Add
, como GridExtensions.Add, se invocan en el diseño en lugar de en la colección Children de diseños.
Es posible que al ejecutar la aplicación .NET MAUI actualizada notes que el comportamiento del diseño es diferente. Para ver más información, consulta Cambios de comportamiento de diseño desde Xamarin.Forms.
Cambios de diseño personalizados
El proceso para crear un diseño personalizado en Xamarin.Forms supone la creación de una clase que deriva de Layout<View>
y la invalidación de los métodos VisualElement.OnMeasure
y Layout.LayoutChildren
. Para ver más información, consulta Creación de un diseño personalizado en Xamarin.Forms.
En .NET MAUI, las clases de diseño derivan de la clase abstracta Layout. Esta clase delega el diseño y la medición multiplataforma en una clase de administrador de diseño. Cada clase del administrador de diseño implementa la interfaz ILayoutManager, que especifica que se deben proporcionar las implementaciones Measure y ArrangeChildren:
- La implementación de Measure llama a IView.Measure en cada vista del diseño y devuelve el tamaño total de este según las restricciones.
- La implementación de ArrangeChildren determina dónde se debe colocar cada vista dentro de los límites del diseño y llama a Arrange en cada vista con sus límites adecuados. El valor devuelto es el tamaño real del diseño.
Para obtener más información, vea Diseños personalizados.
Cambios de dispositivo
Xamarin.Forms tiene una clase Xamarin.Forms.Device
que te ayuda a interactuar con el dispositivo y la plataforma donde se ejecuta la aplicación. La clase equivalente en .NET MAUI, Microsoft.Maui.Controls.Device, está en desuso y su funcionalidad se ha reemplazado por varios tipos.
En la tabla siguiente se muestran las sustituciones de .NET MAUI para la funcionalidad en la clase Xamarin.Forms.Device
:
API Xamarin.Forms | API .NET MAUI | Comentarios |
---|---|---|
Xamarin.Forms.Device.Android |
Microsoft.Maui.Devices.DevicePlatform.Android | |
Xamarin.Forms.Device.iOS |
Microsoft.Maui.Devices.DevicePlatform.iOS | |
Xamarin.Forms.Device.GTK |
No hay equivalente de .NET MAUI. | |
Xamarin.Forms.Device.macOS |
No hay equivalente de .NET MAUI. En su lugar, use Microsoft.Maui.Devices.DevicePlatform.MacCatalyst. | |
Xamarin.Forms.Device.Tizen |
Microsoft.Maui.Devices.DevicePlatform.Tizen | |
Xamarin.Forms.Device.UWP |
Microsoft.Maui.Devices.DevicePlatform.WinUI | |
Xamarin.Forms.Device.WPF |
No hay equivalente de .NET MAUI. | |
Xamarin.Forms.Device.Flags |
No hay equivalente de .NET MAUI. | |
Xamarin.Forms.Device.FlowDirection |
Microsoft.Maui.ApplicationModel.AppInfo.RequestedLayoutDirection | |
Xamarin.Forms.Device.Idiom |
Microsoft.Maui.Devices.DeviceInfo.Idiom | |
Xamarin.Forms.Device.IsInvokeRequired |
Microsoft.Maui.Dispatching.Dispatcher.IsDispatchRequired | |
Xamarin.Forms.Device.OS |
Microsoft.Maui.Devices.DeviceInfo.Platform | |
Xamarin.Forms.Device.RuntimePlatform |
Microsoft.Maui.Devices.DeviceInfo.Platform | |
Xamarin.Forms.Device.BeginInvokeOnMainThread |
Microsoft.Maui.ApplicationModel.MainThread.BeginInvokeOnMainThread | |
Xamarin.Forms.Device.GetMainThreadSynchronizationContextAsync |
Microsoft.Maui.ApplicationModel.MainThread.GetMainThreadSynchronizationContextAsync | |
Xamarin.Forms.Device.GetNamedColor |
No hay equivalente de .NET MAUI. | |
Xamarin.Forms.Device.GetNamedSize |
No hay equivalente de .NET MAUI. | |
Xamarin.Forms.Device.Invalidate |
Microsoft.Maui.Controls.VisualElement.InvalidateMeasure | |
Xamarin.Forms.Device.InvokeOnMainThreadAsync |
Microsoft.Maui.ApplicationModel.MainThread.InvokeOnMainThreadAsync | |
Xamarin.Forms.Device.OnPlatform |
Microsoft.Maui.Devices.DeviceInfo.Platform | |
Xamarin.Forms.Device.OpenUri |
Microsoft.Maui.ApplicationModel.Launcher.OpenAsync | |
Xamarin.Forms.Device.SetFlags |
No hay equivalente de .NET MAUI. | |
Xamarin.Forms.Device.SetFlowDirection |
Microsoft.Maui.Controls.Window.FlowDirection | |
Xamarin.Forms.Device.StartTimer |
Microsoft.Maui.Dispatching.DispatcherExtensions.StartTimer o Microsoft.Maui.Dispatching.Dispatcher.DispatchDelayed |
Cambios de mapa
En Xamarin.Forms, el control Map
y los tipos asociados están en el espacio de nombres Xamarin.Forms.Maps
. En .NET MAUI, esta funcionalidad se ha movido a los espacios de nombres Microsoft.Maui.Controls.Maps y Microsoft.Maui.Maps. Se ha cambiado el nombre de algunas propiedades y algunos tipos se han reemplazado por tipos equivalentes de Xamarin.Essentials.
En la tabla siguiente se muestran las sustituciones de .NET MAUI para la funcionalidad en el espacio de nombres Xamarin.Forms.Maps
:
API Xamarin.Forms | API .NET MAUI | Comentario |
---|---|---|
Xamarin.Forms.Maps.Map.HasScrollEnabled |
Microsoft.Maui.Controls.Maps.Map.IsScrollEnabled | |
Xamarin.Forms.Maps.Map.HasZoomEnabled |
Microsoft.Maui.Controls.Maps.Map.IsZoomEnabled | |
Xamarin.Forms.Maps.Map.TrafficEnabled |
Microsoft.Maui.Controls.Maps.Map.IsTrafficEnabled | |
Xamarin.Forms.Maps.Map.MoveToLastRegionOnLayoutChange |
No hay equivalente de .NET MAUI. | |
Xamarin.Forms.Maps.Pin.Id |
Microsoft.Maui.Controls.Maps.Pin.MarkerId | |
Xamarin.Forms.Maps.Pin.Position |
Microsoft.Maui.Controls.Maps.Pin.Location | |
Xamarin.Forms.Maps.MapClickedEventArgs.Position |
Microsoft.Maui.Controls.Maps.MapClickedEventArgs.Location | |
Xamarin.Forms.Maps.Position |
Microsoft.Maui.Devices.Sensors.Location | Los miembros del tipo Xamarin.Forms.Maps.Position cambiaron al tipo Microsoft.Maui.Devices.Sensors.Location. |
Xamarin.Forms.Maps.Geocoder |
Microsoft.Maui.Devices.Sensors.Geocoding | Los miembros del tipo Xamarin.Forms.Maps.Geocoder cambiaron al tipo Microsoft.Maui.Devices.Sensors.Geocoding. |
.NET MAUI tiene dos tipos de Map
: Microsoft.Maui.Controls.Maps.Map y Microsoft.Maui.ApplicationModel.Map. Dado que el espacio de nombres Microsoft.Maui.ApplicationModel es una de las directivas global using
de .NET MAUI, al usar el control Microsoft.Maui.Controls.Maps.Map del código tendrás que calificar completamente el uso de Map
o usar un alias using.
En XAML, se debe agregar una definición de espacio de nombres xmlns
para el control Map. Aunque esto no es necesario, evita una colisión entre los tipos Polygon
y Polyline
, que existen en los espacios de nombres Microsoft.Maui.Controls.Maps y Microsoft.Maui.Controls.Shapes. Para ver más información, consulta Visualización de un mapa.
Otros cambios
Se ha consolidado un pequeño número de otras API en el traslado de Xamarin.Forms a .NET MAUI. En la tabla siguiente se muestran estos cambios.
API Xamarin.Forms | API .NET MAUI | Comentarios |
---|---|---|
Xamarin.Forms.Application.Properties |
Microsoft.Maui.Storage.Preferences | |
Xamarin.Forms.Button.Image |
Microsoft.Maui.Controls.Button.ImageSource | |
Xamarin.Forms.Frame.OutlineColor |
Microsoft.Maui.Controls.Frame.BorderColor | |
Xamarin.Forms.IQueryAttributable.ApplyQueryAttributes |
Microsoft.Maui.Controls.IQueryAttributable.ApplyQueryAttributes | En Xamarin.Forms, el método ApplyQueryAttributes acepta un argumento IDictionary<string, string> . En .NET MAUI, el método ApplyQueryAttributes acepta un argumento IDictionary<string, object> . |
Xamarin.Forms.MenuItem.Icon |
Microsoft.Maui.Controls.MenuItem.IconImageSource | Xamarin.Forms.MenuItem.Icon es la clase base para Xamarin.Forms.ToolbarItem y, por tanto, ToolbarItem.Icon se convierte en ToolbarItem.IconImageSource . |
Xamarin.Forms.OrientationStateTrigger.Orientation |
Microsoft.Maui.Controls.OrientationStateTrigger.Orientation | En Xamarin.Forms, la propiedad OrientationStateTrigger.Orientation es de tipo Xamarin.Forms.Internals.DeviceOrientation . En .NET MAUI, la propiedad OrientationStateTrigger.Orientation es de tipo DisplayOrientation. |
Xamarin.Forms.OSAppTheme |
Microsoft.Maui.ApplicationModel.AppTheme | |
Xamarin.Forms.Span.ForegroundColor |
Microsoft.Maui.Controls.Span.TextColor | |
Xamarin.Forms.ToolbarItem.Name |
Microsoft.Maui.Controls.MenuItem.Text | Microsoft.Maui.Controls.MenuItem.Text es la clase base para Microsoft.Maui.Controls.ToolbarItem y, por tanto, ToolbarItem.Name se convierte en ToolbarItem.Text . |
Además, en Xamarin.Forms, se llama a la invalidación Page.OnAppearing
en Android cuando se encuentra en segundo plano una aplicación y, a continuación, se lleva al primer plano. Sin embargo, no se llama a esta invalidación en iOS y Windows en el mismo escenario. En .NET MAUI, no se llama a la invalidación de OnAppearing() en ninguna plataforma cuando una aplicación está en segundo plano y a continuación, se lleva al primer plano. En su lugar, debe escuchar los eventos de ciclo de vida en Window para recibir una notificación cuando una aplicación vuelve al primer plano. Para obtener más información, consulte .NET MAUI Windows.
Cambios en los formularios nativos
Los formularios nativos en Xamarin.Forms se han convertido en incrustaciones nativas en .NET MAUI y usan un enfoque de inicialización y métodos de extensión diferentes para convertir controles multiplataforma a sus tipos nativos. Para obtener más información, consulta Inserción nativa.
Cambios de AssemblyInfo
Las propiedades que normalmente se establecen en un archivo AssemblyInfo.cs ahora están disponibles en el proyecto de estilo SDK. Se recomienda migrarlos de AssemblyInfo.cs al archivo de proyecto de cada proyecto y quitar el archivo AssemblyInfo.cs .
Opcionalmente, puedes conservar el archivo AssemblyInfo.cs y establecer la propiedad GenerateAssemblyInfo
en el archivo de tu proyecto en false
:
<PropertyGroup>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
Para obtener más información sobre la propiedad GenerateAssemblyInfo
, consultaGenerateAssemblyInfo.
Actualización de las dependencias de la aplicación
Por lo general, los paquetes NuGet Xamarin.Forms no son compatibles con .NET 8 a menos que se hayan vuelto a compilar mediante monikers de la plataforma de destino (TFM) de .NET. Sin embargo, las aplicaciones Android pueden usar paquetes NuGet destinados a los marcos monoandroid
y monoandroidXX.X
.
Para confirmar que un paquete es compatible con .NET 8, examina la pestaña Marcos de NuGet para el paquete que usa y comprueba que enumera uno de los marcos compatibles que se muestran en la tabla siguiente:
Marcos compatibles | Marcos incompatibles |
---|---|
net8.0-android, monoandroid, monoandroidXX.X | |
net8.0-ios | monotouch, xamarinios, xamarinios10 |
net8.0-macos | monomac, xamarinmac, xamarinmac20 |
net8.0-tvos | xamarintvos |
xamarinwatchos |
Nota:
Las bibliotecas de .NET Standard que no tienen dependencias en los marcos incompatibles enumerados anteriormente siguen siendo compatibles con .NET 8.
Si un paquete de NuGet indica compatibilidad con cualquiera de los marcos compatibles anteriores, independientemente de incluir también marcos incompatibles, el paquete es compatible. Los paquetes NuGet compatibles se pueden agregar al proyecto de biblioteca de .NET MAUI mediante el administrador de paquetes NuGet en Visual Studio.
Si no encuentras una versión compatible con .NET 8 de un paquete NuGet, debes:
- Vuelve a compilar el paquete con TFM de .NET, si posees el código.
- Busca una versión preliminar de una versión de una versión de .NET 8 del paquete.
- Reemplaza la dependencia por una alternativa compatible con .NET 8.
Compilación y solución de problemas
Una vez resueltas las dependencias, debes compilar el proyecto. Los errores te guiarán hacia los pasos siguientes.
Sugerencia
- Elimina todas las carpetas bin y obj de todos los proyectos antes de abrir y compilar proyectos en Visual Studio, especialmente al cambiar las versiones de .NET.
- Elimina el archivo generado Resource.designer.cs del proyecto de Android.
En la tabla siguiente se proporcionan instrucciones para superar problemas comunes de compilación o del tiempo de ejecución:
Problema | Sugerencia |
---|---|
El espacio de nombres Xamarin.* no existe. |
Actualiza el espacio de nombres a su equivalente en .NET MAUI. Para obtener más información, consulta Cambios en el espacio de nombres. |
La API no existe. | Actualiza el uso de la API a su equivalente en .NET MAUI. Para obtener más información, consulta Cambios en la API. |
La aplicación no se implementará. | Asegúrate de que el proyecto de plataforma necesario esté establecido para implementarse en el Administrador de configuración de Visual Studio. |
La aplicación no se iniciará. | Actualiza la clase de punto de entrada de cada proyecto de plataforma y el punto de entrada de la aplicación. Para obtener más información, consulta Arranque de la aplicación migrada. |
CollectionView no se desplaza. | Comprueba el diseño del contenedor y el tamaño medido de CollectionView. De forma predeterminada, el control ocupará tanto espacio como permita el contenedor. Grid restringe los elementos secundarios a su propio tamaño. Sin embargo, StackLayout permite que los elementos secundarios ocupen espacio más allá de sus límites. |
El elemento emergente se muestra bajo la página de iOS. | En Xamarin.Forms, todos los elementos emergentes de iOS son instancias de UIWindow , pero en los elementos emergentes de .NET MAUI se muestran localizando la presentación ViewController actual y mostrando el elemento emergente con PresentViewControllerAsync . En complementos como Mopups, para asegurarte de que los elementos emergentes se muestran correctamente, debes llamar a DisplayAlert, DisplayActionSheet o DisplayPromptAsync desde el elemento ContentPage que se usa dentro del elemento emergente Mopup . |
BoxView no aparece. | El tamaño predeterminado de BoxView en Xamarin.Forms es 40 x 40. El tamaño predeterminado de BoxView .NET MAUI es 0 x 0. Establece WidthRequest y HeightRequest en 40. |
En el diseño, falta relleno, margen o espaciado. | Agrega valores predeterminados al proyecto en función del recurso de estilo MAUI de .NET. Para obtener más información, consulta Cambios del valor predeterminado de Xamarin.Forms. |
El diseño personalizado no funciona. | El código de diseño personalizado necesita actualizar para que funcione en .NET MAUI. Para obtener más información, consulta Cambios en el diseño personalizado. |
El representador personalizado no funciona. | El código del representador necesita actualizarse para que funcione en .NET MAUI. Para obtener más información, consulta Uso de representadores personalizados en .NET MAUI. |
El efecto no funciona. | El código de efecto necesita actualizarse para que funcione en .NET MAUI. Para obtener más información, consulta Uso de efectos en .NET MAUI. |
El código SkiaSharp no funciona. | SkiaSharp código necesita actualizaciones menores para funcionar en .NET MAUI. Para obtener más información, consulte Reutilización del código SkiaSharp en .NET MAUI. |
No se puede acceder a los datos de propiedades de la aplicación creados anteriormente. | Migra los datos de propiedades de la aplicación a las preferencias de .NET MAUI. Para obtener más información, consulta Migración de datos del diccionario de propiedades de la aplicación Xamarin.Forms a las preferencias de. NET MAUI. |
No se puede acceder a los datos de almacenamiento seguros creados anteriormente. | Migra los datos del almacenamiento seguro a .NET MAUI. Para obtener más información, consulta Migración del almacenamiento seguro de Xamarin.Essentials al almacenamiento seguro de .NET MAUI. |
No se puede acceder a los datos de seguimiento de versiones creados anteriormente. | Migra los datos de seguimiento de versiones a .NET MAUI. Para obtener más información, consulta Migración de datos de seguimiento de versiones de una aplicación Xamarin.Forms a una aplicación .NET MAUI. |