Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
La actualización de una aplicación de varios proyectos Xamarin.Forms a una aplicación de aplicaciones multiplataforma de .NET multiproyecto (.NET MAUI) sigue los mismos pasos que un proyecto de Xamarin.Android y Xamarin.iOS, con pasos adicionales para aprovechar los cambios en .NET MAUI.
En este artículo se describe cómo migrar manualmente un Xamarin.Forms proyecto de biblioteca a un proyecto de biblioteca MAUI de .NET. Antes de hacerlo, debe actualizar los Xamarin.Forms proyectos de plataforma para que sean proyectos de estilo SDK. Los proyectos de estilo SDK utilizan el mismo formato de proyecto que todas las cargas de trabajo de .NET y, en comparación con muchos proyectos de Xamarin, son mucho menos verbosos. Para obtener información sobre cómo actualizar los proyectos de la aplicación, consulte Actualización de proyectos de Xamarin.Android, Xamarin.iOS y Xamarin.Mac a .NET, Xamarin.Android, Migración de proyectos de Xamarin Apple y Xamarin.Forms Migración de proyectos de UWP.
Para migrar un Xamarin.Forms proyecto de biblioteca a un proyecto de biblioteca MAUI de .NET, debe:
- Actualiza tu aplicación Xamarin.Forms para usar Xamarin.Forms 5.
- Actualiza las dependencias de la aplicación a las versiones más recientes.
- Asegúrese de que la aplicación siga funcionando.
- Actualice el archivo del proyecto para que sea de estilo SDK.
- Actualizar espacios de nombres.
- Aborda cualquier cambio en la API.
- Configurar .NET MAUI.
- Actualiza o reemplaza las dependencias incompatibles con las versiones de .NET 8.
- Compila y prueba tu aplicación.
Para simplificar el proceso de actualización, debe crear un nuevo proyecto de biblioteca .NET MAUI con el mismo nombre que el proyecto de biblioteca Xamarin.Forms, y luego copiar el código, la configuración y los recursos. Esta es la estrategia delineada a continuación.
Actualiza tu Xamarin.Forms aplicación
Antes de actualizar tu aplicación Xamarin.Forms a .NET MAUI, primero deberías actualizar tu aplicación Xamarin.Forms para usar Xamarin.Forms 5 y asegurarte de que siga funcionando correctamente. Además, debes actualizar las dependencias que utiliza tu 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 utilizando versiones compatibles con .NET de tus dependencias, si existen.
Creación de un nuevo proyecto
En Visual Studio, cree un nuevo proyecto de biblioteca de clases MAUI de .NET con el mismo nombre que el Xamarin.Forms proyecto de biblioteca. Este proyecto hospedará el código del proyecto de biblioteca Xamarin.Forms. Al abrir el archivo del proyecto, se confirmará que tiene un proyecto de estilo SDK de .NET:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net8.0;net8.0-android;net8.0-ios;net8.0-maccatalyst</TargetFrameworks>
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net8.0-windows10.0.19041.0</TargetFrameworks>
<!-- Uncomment to also build the tizen app. You will need to install tizen by following this: https://github.com/Samsung/Tizen.NET -->
<!-- <TargetFrameworks>$(TargetFrameworks);net8.0-tizen</TargetFrameworks> -->
<UseMaui>true</UseMaui>
<SingleProject>true</SingleProject>
<ImplicitUsings>enable</ImplicitUsings>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">11.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'maccatalyst'">13.1</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">21.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</SupportedOSPlatformVersion>
<TargetPlatformMinVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</TargetPlatformMinVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'tizen'">6.5</SupportedOSPlatformVersion>
</PropertyGroup>
</Project>
En los proyectos de la plataforma, agregue una referencia a este nuevo proyecto de biblioteca. A continuación, copie los Xamarin.Forms archivos de librería en el proyecto de librería MAUI de .NET.
Cambios de espacio de nombres
Los espacios de nombres han cambiado en la transición de Xamarin.Forms a .NET MAUI, y las características de Xamarin.Essentials ahora forman parte de .NET MAUI. Para realizar actualizaciones de espacios de nombres, lleva a cabo una búsqueda y reemplazo para los siguientes espacios de nombres:
Los proyectos de .NET MAUI hacen uso de directivas implícitas. Esta función te permite eliminar las using
directivas para el espacio de nombres Xamarin.Essentials
, sin tener que reemplazarlas por los espacios de nombres equivalentes de .NET MAUI.
Además, el espacio de nombres 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, debe reemplazar todas las apariciones de xmlns="http://xamarin.com/schemas/2014/forms"
por xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
.
Nota:
Puedes actualizar rápidamente tus Xamarin.Forms
espacios de nombres a Microsoft.Maui
utilizando Acciones rápidas en Visual Studio, siempre que tengas instalado Upgrade Assistant.
Cambios de API
Algunas API han cambiado en la transición de Xamarin.Forms a .NET MAUI. Esta es una serie de razones, incluyendo la eliminación de funcionalidades duplicadas causadas por el hecho de que Xamarin.Essentials se convierte en parte de .NET MAUI, y asegurar que las API sigan las directrices de nombres de .NET. Las siguientes secciones analizan estos cambios.
Cambios de color
En Xamarin.Forms, la estructura Xamarin.Forms.Color
te permite construir objetos Color utilizando valores double
, y proporciona colores nombrados, como Xamarin.Forms.Color.AliceBlue
. En .NET MAUI, esta funcionalidad se ha separado en la clase Microsoft.Maui.Graphics.Color y la clase Microsoft.Maui.Graphics.Colors.
La clase Microsoft.Maui.Graphics.Color, en el espacio de nombres Microsoft.Maui.Graphics, te permite construir objetos Color usando 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 parte los mismos colores nombrados. Por ejemplo, use Colors.AliceBlue para especificar el color AliceBlue
.
La siguiente tabla muestra los cambios de la API entre la estructura Xamarin.Forms.Color
y la clase Microsoft.Maui.Graphics.Color.
Xamarin.Forms Interfaz de Programación de Aplicaciones (API) | API de MAUI de .NET | 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 | Xamarin.Forms propiedad reemplazada por un método en .NET MAUI. |
Xamarin.Forms.Color.Saturation |
Microsoft.Maui.Graphics.Color.GetSaturation | Xamarin.Forms propiedad reemplazada por un método en .NET MAUI. |
Xamarin.Forms.Color.Luminosity |
Microsoft.Maui.Graphics.Color.GetLuminosity | Xamarin.Forms propiedad reemplazada por un método en .NET MAUI. |
Xamarin.Forms.Color.Default |
"No hay equivalente de .NET MAUI." En su lugar, los objetos Microsoft.Maui.Graphics.Color se establecen por defecto en 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 está obsoleto y se eliminará en una futura versión. |
Además, todos los valores numéricos en un 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
La siguiente tabla enumera las API de diseño que se han eliminado en la transición de Xamarin.Forms a .NET MAUI.
Xamarin.Forms Interfaz de Programación de Aplicaciones (API) | API de MAUI de .NET | Comentarios |
---|---|---|
Xamarin.Forms.AbsoluteLayout.IAbsoluteList<T>.Add |
La Add sobrecarga que acepta tres 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 un control de compatibilidad para los usuarios que migran desde Xamarin.Forms. Utiliza Grid en su lugar, o añade el xmlns para el espacio de nombres de compatibilidad. |
Además, agregar elementos secundarios a un diseño en el código en Xamarin.Forms se realiza añadiendo 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 de uso interno de .NET MAUI y no debe ser manipulada directamente. Por lo tanto, en el código, los hijos deben añadirse directamente al diseño.
Grid grid = new Grid();
grid.Add(new Label { Text = "Hello world" });
Importante
Cualquier método de extensión de Add
layout, como GridExtensions.Add, se invoca en el layout en lugar de en la colección de Children layouts.
Puede notar que al ejecutar su aplicación .NET MAUI actualizada, el comportamiento del diseño es diferente. Para más información, consulte Cambios en el comportamiento del diseño desde Xamarin.Forms.
Cambios en el diseño personalizado
El proceso para crear un diseño personalizado en Xamarin.Forms implica crear una clase que derive de Layout<View>
y sobrescribir los métodos VisualElement.OnMeasure
y Layout.LayoutChildren
. Para más información, consulta Crea 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 a una clase gestora de diseño. Cada clase de gestor de diseño implementa la interfaz ILayoutManager, que especifica que deben proporcionarse las implementaciones de Measure y ArrangeChildren.
- La implementación Measure llama a IView.Measure en cada vista del diseño y devuelve el tamaño total del diseño dadas las restricciones.
- La implementación de ArrangeChildren determina dónde debe colocarse cada vista dentro de los límites del diseño y llama a Arrange en cada vista con sus límites apropiados. El valor de retorno es el tamaño real del diseño.
Para obtener más información, consulte Diseños personalizados.
Cambios de dispositivo
Xamarin.Forms tiene una Xamarin.Forms.Device
clase que le ayuda a interactuar con el dispositivo y la plataforma en la que se ejecuta la aplicación. La clase equivalente en .NET MAUI, Microsoft.Maui.Controls.Device, está obsoleta y su funcionalidad se ha sustituido por varios tipos.
La siguiente tabla muestra los reemplazos de .NET MAUI para la funcionalidad en la clase Xamarin.Forms.Device
.
Xamarin.Forms Interfaz de Programación de Aplicaciones (API) | API de .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, utilice 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 en el 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 Microsoft.Maui.Controls.Maps y Microsoft.Maui.Maps namespaces. Algunas propiedades han sido renombradas y algunos tipos han sido reemplazados por tipos equivalentes de Xamarin.Essentials.
La siguiente tabla muestra los reemplazos de .NET MAUI para la funcionalidad en el espacio de nombres Xamarin.Forms.Maps
.
Xamarin.Forms Interfaz de Programación de Aplicaciones (API) | .NET MAUI API | 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 se han cambiado al tipo Microsoft.Maui.Devices.Sensors.Location. |
Xamarin.Forms.Maps.Geocoder |
Microsoft.Maui.Devices.Sensors.Geocoding | Los miembros del tipo Xamarin.Forms.Maps.Geocoder se han cambiado al tipo Microsoft.Maui.Devices.Sensors.Geocoding. |
.NET MAUI tiene dos tipos de Map
- Microsoft.Maui.Controls.Maps.Map y Microsoft.Maui.ApplicationModel.Map. Debido a que el espacio de nombres Microsoft.Maui.ApplicationModel es una de las directivas de .NET MAUI, al usar el control global using
desde el código, deberá calificar completamente su uso Microsoft.Maui.Controls.Maps.Map o usar un Map
.
En XAML, se debe agregar un espacio de nombres xmlns
para la definición de 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 más información, consulte Mostrar un mapa.
Otros cambios
Se ha consolidado un pequeño número de otras API durante el traslado de Xamarin.Forms a .NET MAUI. La siguiente tabla muestra estos cambios.
Xamarin.Forms Interfaz de Programación de Aplicaciones (API) | API de .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 ApplyQueryAttributes método acepta un IDictionary<string, object> argumento. |
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 OrientationStateTrigger.Orientation propiedad 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.ToolbarItemy, por tanto ToolbarItem.Name , se convierte en ToolbarItem.Text . |
Además, en Xamarin.Forms, la Page.OnAppearing
sobrecarga se llama en Android cuando una aplicación se pone en segundo plano y luego se devuelve al primer plano. Sin embargo, esta sobrescritura no se llama en iOS y Windows en el mismo escenario. En .NET MAUI, el reemplazo OnAppearing() no se llama en ninguna plataforma cuando una aplicación está en segundo plano y luego se lleva al primer plano. En su lugar, debería escuchar los eventos del ciclo de vida en Window para ser notificado cuando una aplicación vuelva al primer plano. Para obtener más información, vea .NET MAUI windows.
Cambios en los formularios nativos
Native forms en Xamarin.Forms se ha convertido en incrustación nativa en .NET MAUI, y usa un enfoque de inicialización diferente y diferentes métodos de extensión para convertir los controles multiplataforma a sus tipos nativos. Para más información, consulte Native embedding.
Pon en marcha tu aplicación migrada
Al actualizar manualmente una Xamarin.Forms aplicación a .NET MAUI, deberá habilitar la compatibilidad con .NET MAUI en cada proyecto de plataforma, actualizar la clase de punto de entrada de cada proyecto de plataforma y, a continuación, configurar el arranque de la aplicación .NET MAUI.
Habilitación de .NET MAUI en proyectos de plataforma
Antes de actualizar la clase de punto de entrada de cada proyecto de plataforma, primero debe habilitar la compatibilidad con .NET MAUI. Esto se puede lograr estableciendo la propiedad $(UseMaui)
true
de compilación en cada proyecto de plataforma.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<UseMaui>true</UseMaui>
</PropertyGroup>
</Project>
Importante
Debe agregar <UseMaui>true</UseMaui>
al archivo de proyecto para habilitar la compatibilidad con .NET MAUI. Además, asegúrese de que ha agregado <EnableDefaultMauiItems>false</EnableDefaultMauiItems>
al archivo de proyecto de WinUI. Esto evitará que recibas errores de compilación sobre el método InitializeComponent
ya está definido.
Agregar referencias de paquete
En .NET 8, .NET MAUI se distribuye como un elemento de trabajo (workload) de .NET, así como varios paquetes NuGet. La ventaja de este enfoque es que permite anclar fácilmente los proyectos a versiones específicas, a la vez que le permite obtener una vista previa sencilla de compilaciones no publicadas o experimentales.
Debe agregar las siguientes referencias de paquete explícitas en el <ItemGroup>
de cada archivo de proyecto.
<PackageReference Include="Microsoft.Maui.Controls" Version="$(MauiVersion)" />
<PackageReference Include="Microsoft.Maui.Controls.Compatibility" Version="$(MauiVersion)" />
La variable $(MauiVersion)
se refiere a la versión de .NET MAUI que ha instalado. Para invalidar esto, agregue la $(MauiVersion)
propiedad build a cada archivo de proyecto:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<UseMaui>True</UseMaui>
<MauiVersion>8.0.3</MauiVersion>
</PropertyGroup>
</Project>
Configuración del proyecto de Android
En el proyecto de .NET MAUI Android, actualice la MainApplication
clase para que coincida con el código siguiente:
using System;
using Android.App;
using Android.Runtime;
using Microsoft.Maui;
using Microsoft.Maui.Hosting;
using YOUR_MAUI_CLASS_LIB_HERE;
namespace YOUR_NAMESPACE_HERE.Droid
{
[Application]
public class MainApplication : MauiApplication
{
public MainApplication(IntPtr handle, JniHandleOwnership ownership) : base(handle, ownership)
{
}
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}
}
Actualice también la MainActivity
clase para heredar de MauiAppCompatActivity
:
using System;
using Microsoft.Maui;
using Android.App;
using Android.Content.PM;
using Android.Runtime;
using Android.OS;
namespace YOUR_NAMESPACE_HERE.Droid
{
[Activity(Label = "MyTitle", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize)]
public class MainActivity : MauiAppCompatActivity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
}
}
}
A continuación, actualice el archivo de manifiesto para especificar que es minSdKVersion
21, que es la versión mínima de Android SDK requerida por .NET MAUI. Esto se puede lograr modificando el <uses-sdk />
nodo, que es un elemento secundario del <manifest>
nodo:
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="32" />
Configuración del proyecto de iOS
En el proyecto de .NET MAUI iOS, actualice la AppDelegate
clase para heredar de MauiUIApplicationDelegate
:
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Maui;
using Foundation;
using UIKit;
using YOUR_MAUI_CLASS_LIB_HERE;
namespace YOUR_NAMESPACE_HERE.iOS
{
[Register("AppDelegate")]
public partial class AppDelegate : MauiUIApplicationDelegate
{
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}
}
A continuación, actualice Info.plist para que MinimumOSVersion
sea 11.0, que es la versión mínima de iOS requerida por .NET MAUI.
Configuración del proyecto para UWP
En el proyecto .NET MAUI WinUI 3, actualice App.xaml para que coincida con el código siguiente:
<?xml version="1.0" encoding="utf-8"?>
<maui:MauiWinUIApplication
x:Class="YOUR_NAMESPACE_HERE.WinUI.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:maui="using:Microsoft.Maui"
xmlns:local="using:YOUR_NAMESPACE_HERE.WinUI">
<maui:MauiWinUIApplication.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls" />
<!-- Other merged dictionaries here -->
</ResourceDictionary.MergedDictionaries>
<!-- Other app resources here -->
</ResourceDictionary>
</maui:MauiWinUIApplication.Resources>
</maui:MauiWinUIApplication>
Nota:
Si el proyecto incluía recursos en app.xaml existente, debe migrarlos a la nueva versión del archivo.
Además, actualice App.xaml.cs para que coincida con el código siguiente:
using Microsoft.Maui;
using Microsoft.Maui.Hosting;
using YOUR_MAUI_CLASS_LIB_HERE;
namespace YOUR_NAMESPACE_HERE.WinUI;
public partial class App : MauiWinUIApplication
{
public App()
{
InitializeComponent();
}
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}
Nota:
Si el proyecto incluía lógica de negocios en App.xaml.cs debe migrar esa lógica a la nueva versión del archivo.
A continuación, agregue un archivo launchSettings.json a la carpeta Properties del proyecto y agregue el siguiente JSON al archivo:
{
"profiles": {
"Windows Machine": {
"commandName": "MsixPackage",
"nativeDebugging": true
}
}
}
Punto de entrada de la aplicación
Las aplicaciones MAUI de .NET tienen un único punto de entrada de aplicación multiplataforma. Cada punto de entrada de plataforma llama a un CreateMauiApp
método en la clase estática MauiProgram
y devuelve un MauiApp.
Por lo tanto, agregue una nueva clase denominada MauiProgram
que contenga el código siguiente:
namespace YOUR_NAMESPACE_HERE;
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>();
return builder.Build();
}
}
Nota:
Para los proyectos de Xamarin.Forms UWP, la referencia App
en builder.UseMauiApp<App>()
se encuentra en el archivo MainPage.xaml.cs.
Si hay servicios específicos de la plataforma que deben migrarse a .NET MAUI, use el AddTransient(IServiceCollection, Type) método para agregar un servicio transitorio del tipo especificado al especificado IServiceCollection.
Nota:
Puedes actualizar rápidamente tus Xamarin.Forms
espacios de nombres a Microsoft.Maui
utilizando Acciones rápidas en Visual Studio, siempre que tengas instalado Upgrade Assistant.
Cambios de AssemblyInfo
Las propiedades que generalmente se establecen en un archivo AssemblyInfo.cs ahora están disponibles en su proyecto de estilo SDK. Recomendamos migrarlos de AssemblyInfo.cs al archivo de proyecto en cada proyecto y eliminar el archivo AssemblyInfo.cs.
Opcionalmente, puedes mantener el archivo AssemblyInfo.cs y establecer la propiedad GenerateAssemblyInfo
en tu archivo de proyecto a false
.
<PropertyGroup>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
Para obtener más información sobre la propiedad GenerateAssemblyInfo
, consulte GenerateAssemblyInfo.
Actualizar las dependencias de la aplicación
Generalmente, Xamarin.Forms los paquetes NuGet no son compatibles con .NET 8 a menos que hayan sido recompilados utilizando los monikers del marco de trabajo objetivo de .NET (TFMs). Sin embargo, las aplicaciones de Android pueden usar paquetes NuGet dirigidos a los marcos monoandroid
y monoandroidXX.X
.
Puede confirmar que un paquete es compatible con .NET 8 mirando la pestaña de Frameworks en NuGet para el paquete que está utilizando, y comprobando que enumera uno de los frameworks compatibles que se muestran en la tabla a continuación:
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 de los marcos incompatibles listados anteriormente siguen siendo compatibles con .NET 8.
Si un paquete en NuGet indica compatibilidad con cualquiera de los marcos compatibles mencionados anteriormente, independientemente de incluir también marcos incompatibles, entonces el paquete es compatible. Los paquetes NuGet compatibles se pueden agregar a su proyecto de biblioteca .NET MAUI utilizando el administrador de paquetes NuGet en Visual Studio.
Si no puedes encontrar una versión compatible con .NET 8 de un paquete de NuGet, deberías:
- Vuelva a compilar el paquete con los TFMs de .NET, si posee el código.
- Busca una versión preliminar del paquete de .NET 8.
- Reemplaza la dependencia con una alternativa compatible con .NET 8.
Compilar y solucionar problemas
Una vez resueltas las dependencias, debe compilar su proyecto. Los errores le guiarán hacia los pasos siguientes.
Sugerencia
- Elimine 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.
La siguiente tabla proporciona orientación para superar problemas comunes de compilación o de tiempo de ejecución.
Cuestión | Sugerencia |
---|---|
Xamarin.* espacio de nombres no existe. |
Actualiza el espacio de nombres a su equivalente en .NET MAUI. Para más información, consulte Cambios en el espacio de nombres. |
La API no existe. | Actualiza el uso de la API a su equivalente en .NET MAUI. Para más información, consulte Cambios de API. |
La aplicación no se desplegará. | Asegúrese de que el proyecto de plataforma necesario esté establecido para implementarlo en Configuration Manager 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 más información, consulte Arranque su aplicación migrada. |
CollectionView no se desplaza. | Comprueba el diseño del contenedor y el tamaño medido del CollectionView. De forma predeterminada, el control ocupará tanto espacio como permita el contenedor. Restringe a Grid los elementos secundarios a su tamaño propio. Sin embargo, un StackLayout permite que los niños ocupen espacio más allá de sus límites. |
El elemento emergente se muestra debajo de la página en iOS. | En Xamarin.Forms, todas las ventanas emergentes en iOS son instancias de UIWindow , pero en .NET MAUI las ventanas emergentes se muestran ubicando el ViewController actual que presenta y mostrando la ventana emergente con PresentViewControllerAsync . En plugins como Mopups, para asegurarte de que tus ventanas emergentes se muestren correctamente, debes llamar a DisplayAlert (o DisplayAlertAsync en .NET 10+), DisplayActionSheet (o DisplayActionSheetAsync en .NET 10+), o DisplayPromptAsync desde el ContentPage que se usa dentro del Mopup de la ventana emergente. |
BoxView no aparece. | El tamaño predeterminado de un BoxView en Xamarin.Forms es 40x40. El tamaño predeterminado de un BoxView en .NET MAUI es 0x0. Establezca WidthRequest y HeightRequest en 40. |
Faltan relleno, margen o espacio en el diseño. | Agrega valores predeterminados a tu proyecto según el recurso de estilo .NET MAUI. Para obtener más información, consulte cambios del valor predeterminado desde Xamarin.Forms. |
La disposición personalizada no funciona. | El código de diseño personalizado necesita actualizarse para funcionar en .NET MAUI. Para más información, consulte Custom layout changes. |
El procesador personalizado no funciona. | El código del renderizador necesita actualizarse para funcionar en .NET MAUI. Para más información, consulte Use custom renderers in .NET MAUI. |
El efecto no funciona. | El código de efecto necesita actualizar para que funcione en .NET MAUI. Para más información, consulte Use effects in .NET MAUI. |
SkiaSharp el código no funciona. | SkiaSharp el código necesita actualizaciones secundarias para que funcionen en .NET MAUI. Para más información, consulte Reuse SkiaSharp code in .NET MAUI. |
No se puede acceder a los datos de las propiedades de la aplicación creadas anteriormente. | Migra los datos de propiedades de la aplicación a las preferencias de .NET MAUI. Para obtener más información, consulte Migrar 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 seguro creados anteriormente. | Migre los datos de almacenamiento seguro a .NET MAUI. Para más información, consulte Migración del Xamarin.Essentials almacenamiento seguro a 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 más información, consulte Migrar datos de seguimiento de versiones de una Xamarin.Forms aplicación a una aplicación .NET MAUI. |