Novedades de .NET MAUI para .NET 8
El enfoque de .NET MAUI en .NET 8 es la calidad. En .NET 8, se combinaron 1618 solicitudes de incorporación de cambios que cerraron 689 problemas. Esto incluye cambios del equipo de .NET MAUI, así como de la comunidad de .NET MAUI. Estos cambios deben dar lugar a un aumento significativo de la calidad en .NET 8.
Importante
Debido a trabajar con dependencias externas subyacentes, como Xcode o Android SDK Tools, la directiva de compatibilidad de NET Multi-platform App UI (.NET MAUI) difiere de la directiva de compatibilidad de .NET y .NET Core. Para obtener más información, consulta la directiva de soporte técnico de .NET MAUI .
En .NET 8, .NET MAUI se distribuye como una carga de trabajo de .NET y varios paquetes NuGet. La ventaja de este enfoque es que permite anclar fácilmente los proyectos a versiones específicas, a la vez que te permite obtener una vista previa sencilla de compilaciones no publicadas o experimentales. Al crear un nuevo proyecto .NET MAUI, los paquetes NuGet necesarios se agregan automáticamente al proyecto.
En este artículo se enumeran las nuevas características de .NET MAUI y se proporcionan vínculos a información más detallada sobre cada una.
Para obtener información sobre las novedades de .NET 8, consulta Novedades de .NET 8.
Nueva funcionalidad
Aunque el enfoque de esta versión de .NET MAUI es la calidad, también hay algunas nuevas funcionalidades que permiten nuevos escenarios en las aplicaciones.
Controles
- Controles que admiten métodos de extensión de entrada de texto que admiten ocultar y mostrar la entrada de teclado en pantalla. Para obtener más información, consulta Hide and show the soft input keyboard.
- La ContentPage clase obtiene una propiedad HideSoftInputOnTapped, que indica si pulsar en cualquier parte de la página hará que la entrada de teclado en pantalla se oculte si está visible. Para obtener más información, consulta ContentPage.
- BlazorWebView obtiene una propiedad StartPath, un método TryDispatchAsync y funcionalidades de registro mejoradas. Para obtener más información, consulta Hospedaje de una aplicación web blazor en una aplicación MAUI de .NET mediante BlazorWebView.
- WebView obtiene una propiedad UserAgent. Para obtener más información, consulta WebView.
- La reproducción multimedia insertada de vídeo HTML5, incluida la reproducción automática y la imagen en la imagen, se ha habilitado de forma predeterminada para WebView en iOS. Para obtener más información, consulta Establecer preferencias de reproducción multimedia en iOS y Mac Catalyst.
- La sobrecarga
Grid.Add
que acepta 5 argumentos se ha agregado de nuevo a .NET MAUI. Pero este método está en desuso y solo está presente para ayudar a las migraciones desde Xamarin.Forms. - Grid obtiene un método de extensión AddWithSpan que agrega una vista a Grid, en la fila y columna especificadas con los intervalos de fila y columna especificados.
Escritorio
- Los elementos de la barra de menús y los elementos de menú contextual se pueden invocar a través de métodos abreviados de teclado conocidos como aceleradores de teclado. Para obtener más información, consulta Aceleradores de teclado.
- Las aplicaciones de Windows se pueden publicar como aplicaciones desempaquetadas. Para obtener más información, consulta Publish an unpackaged .NET MAUI app for Windows with the CLI.
Reconocedores de gestos
- PointerGestureRecognizer obtiene propiedades PointerPressedCommand, PointerPressedCommandParameter, PointerReleasedCommand, PointerReleasedCommandParameter y eventos PointerPressed y PointerReleased. Para obtener más información, consulta Recognize a pointer gesture.
- El objeto PointerEventArgs que acompaña a los eventos de puntero generados por la clase PointerGestureRecognizer obtiene una propiedad PlatformArgs de tipo PlatformPointerEventArgs. Esta propiedad proporciona acceso a los argumentos específicos de la plataforma para un evento de gesto del puntero. Para obtener más información, consulta Recognize a pointer gesture.
- Los objetos DragStartingEventArgs, DragEventArgs, DropEventArgs y DropCompletedEventArgs que acompañan a los eventos de gestos de arrastrar y colocar obtienen cada propiedad
PlatformArgs
. Esta propiedad proporciona acceso a los argumentos específicos de la plataforma para un evento de arrastrar y colocar. Para obtener más información, consulta Reconocimiento de un gesto de arrastrar y colocar. - La posición en la que se puede obtener un gesto de arrastrar y colocar llamando al método GetPosition en un objeto DragEventArgs, DragStartingEventArgs o DropEventArgs. Para obtener más información, consulta Reconocimiento de un gesto de arrastrar y colocar.
- La clase TapGestureRecognizer obtiene la capacidad de controlar pulsaciones secundarias en Android. Para obtener más información, consulta Reconocimiento de un gesto de pulsación.
Navegación
- La navegación de Shell obtiene una sobrecarga GoToAsync que permite pasar datos de navegación de uso único, que se borran después de que se haya producido la navegación, como un objeto ShellNavigationQueryParameters. Para obtener más información, consulta Pass single use object-based navigation data.
Integración de la plataforma
- La clase Geolocation puede escuchar los cambios de ubicación cuando la aplicación está en primer plano. Para obtener más información, consulta la sección Listen for location changes.
- Flashlight obtiene un método IsSupportedAsync que determina si una linterna está disponible en el dispositivo. Para obtener más información, consulta Flashlight.
- Los intervalos SensorSpeed se han unificado en todas las plataformas. Para obtener más información, consulta el artículo sobre el Accessing device sensors.
- La clase Permissions obtiene el permiso Permissions.Bluetooth, que es un permiso de Android 12 para buscar dispositivos Bluetooth, lo que hace que el dispositivo actual sea reconocible para otros dispositivos Bluetooth y para comunicarse con otros ya emparejados. Para más información, consulte Permisos.
- La clase Permissions obtiene el permiso Permissions.NearbyWifiDevices, que es un permiso de Android 13 para acceder a dispositivos WiFi cercanos. Para más información, consulte Permisos.
XAML
- El atributo
x:ClassModifier
se puede especificar en clases XAML para controlar el nivel de acceso de una clase generada en un ensamblado. Para obtener más información, consulta Class modifiers. - Los recursos definidos en un ResourceDictionary también se pueden consumir en
AppThemeBinding
con la extensión de marcadoDynamicResource
. Para obtener más información, consulta Define and consume theme resources. - Color es la
ContentProperty
de la clase SolidColorBrush, por lo que no es necesario establecerla de forma explícita desde XAML.
Solución de problemas
- Para solucionar problemas, se puede deshabilitar la generación de recursos. Para obtener más información, consulta Disable image packaging, Disable splash screen packaging, Disable font packaging y Disable asset file packaging.
- Para solucionar problemas, se puede generar una pantalla de presentación en blanco. Para obtener más información, consulta Generate a blank splash screen.
- El cambiador de tamaño comprueba si hay nombres de archivo de imagen duplicados. Para obtener más información, consulta Duplicate image filename errors.
Varios
- La administración de ventanas se puede desacoplar de la clase
App
. Para obtener más información, consulta Decouple window management from the App class. - Varias fuentes del sistema se pueden consumir fácilmente en aplicaciones Android. Para obtener más información, consulta Consume fonts.
- En iOS,
MauiUIApplicationDelegate
obtiene un métodoPerformFetch
que se puede invalidar o consumir a través del delegadoiOSLifecycle.PerformFetch
. Para obtener más información, consulte Eventos de ciclo de vida de la plataforma iOS y Mac Catalyst.
Tipo de desuso y eliminación
Los siguientes tipos o miembros han quedado en desuso:
- ClickGestureRecognizer está en desuso.
- Las propiedades adjuntas
AutomationProperties.Name
,AutomationProperties.HelpText
yAutomationProperties.LabeledBy
han quedado en desuso. - FocusChangeRequested está en desuso. En su lugar, usa el método Focus() para intentar establecer el foco en la vista.
Se han quitado los siguientes tipos o miembros:
- La propiedad
Application.Properties
y el métodoApplication.SavePropertiesAsync
se han quitado. Para migrar los datos de propiedades de la aplicación a .NET MAUI, consulta Migración de datos del diccionario de propiedades de la aplicación de Xamarin.Forms a preferencias de MAUI de .NET. - Se ha quitado la propiedad
PhoneDialer.Current
. En su lugar, usePhoneDialer.Default
. OpenGLView
se ha quitado.
Cambios de comportamiento
El comportamiento siguiente ha cambiado de la versión anterior:
- El uso del control Map de XAML ahora requiere la siguiente declaración de espacio de nombres
xmlns
:xmlns:maps="http://schemas.microsoft.com/dotnet/2021/maui/maps"
. - El almacenamiento en caché de imágenes está deshabilitado en Android al cargar una imagen desde una secuencia con el método
ImageSource.FromStream
. Esto se debe a la falta de datos de los que crear una clave de caché razonable. - En iOS, las páginas se desplazan automáticamente cuando el teclado de entrada en pantalla cubriría un campo de entrada de texto, de modo que el campo esté por encima del teclado de entrada en pantalla. Puede llamarse el método
KeyboardAutoManagerScroll.Disconnect
, en el espacio de nombresMicrosoft.Maui.Platform
, para deshabilitar este comportamiento predeterminado. Puede llamarse al métodoKeyboardAutoManagerScroll.Connect
para volver a habilitar el comportamiento después de deshabilitarlo. - Cómo se establece el color de una pestaña en una aplicación de Shell en algunas plataformas. Para obtener más información, vea Apariencia de las pestañas.
- No es necesario especificar un valor para la propiedad de compilación
$(ApplicationIdGuid)
en el archivo de proyecto de la aplicación. Esto se debe a que las aplicaciones Windows de.NET MAUI ya no requieren un GUID como identificador de aplicación y, en su lugar, usan el valor de la propiedad de compilación$(ApplicationId)
. Por lo tanto, ahora se usa el mismo identificador de aplicación de formato de dominio inverso en todas las plataformas, como com.mycompany.myapp. - Las aplicaciones .NET MAUI Mac Catalyst ya no están limitadas a 50 elementos de menú en la barra de menús.
- El método
PlatformImage.FromStream
, en el espacio de nombresMicrosoft.Maui.Graphics
, ahora se puede usar para cargar imágenes en Windows en lugar de tener que usar la claseW2DImageLoadingService
. - En Android, las animaciones respetan la configuración de animación del sistema. Para obtener más información, vea Información general sobre animaciones.
Rendimiento
Hay muchos cambios de rendimiento en .NET MAUI 8. Estos cambios se pueden clasificar en cinco áreas:
- Nuevas características
- Rendimiento de bucles internos y de compilación
- Mejoras en el rendimiento o el tamaño de la aplicación
- Estructuras y
IEquatable
en .NET MAUI - Corrección de problemas de rendimiento en
{AppThemeBinding}
- Dirección
CA1307
yCA1309
rendimiento - Dirección
CA1311
del rendimiento - Eliminación del evento sin usar
ViewAttachedToWindow
en Android - Eliminación de
System.Reflection
superfluos para{Binding}
- Uso de
StringComparer.Ordinal
paraDictionary
yHashSet
- Reducción de la interoperabilidad de Java en
MauiDrawable
Android - Mejora del rendimiento de diseño de
Label
en Android - Reducción de las llamadas de interoperabilidad de Java para controles en .NET MAUI
- Mejora del rendimiento de
Entry.MaxLength
en Android - Mejora del uso de memoria de
CollectionView
en Windows - Uso de
UnmanagedCallersOnlyAttribute
en plataformas de Apple - Interoperabilidad de Java más rápida para cadenas en Android
- Interoperabilidad de Java más rápida para eventos de C# en Android
- Uso de punteros de función para JNI
- Eliminación de
Xamarin.AndroidX.Legacy.Support.V4
- Desduplicación de genéricos en iOS y macOS
- Corrección de la implementación de
System.Linq.Expressions
en plataformas similares a iOS - Establecimiento de
DynamicCodeSupport=false
para iOS y Catalyst
- Estructuras y
- Fugas de memoria
- Herramientas y documentación
Para obtener más información, consulta .NET 8 Performance Improvements in .NET MAUI.
Actualización de .NET 7 a .NET 8
Para actualizar los proyectos de .NET 7 a .NET 8, instala .NET 8 y la carga de trabajo .NET MAUI con Visual Studio 17.8+ con el instalador independiente y el comando dotnet workload install maui
.
Después abre el archivo .csproj y cambia Target Framework Monikers (TFM) de 7 a 8. Si usa un TFM, como net7.0-ios13.6
, asegúrate de que coincida con la versión de la plataforma o elimínalo por completo. En el ejemplo siguiente se muestran los TFM para un proyecto de .NET 7:
<TargetFrameworks>net7.0-android;net7.0-ios;net7.0-maccatalyst;net7.0-tizen</TargetFrameworks>
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net7.0-windows10.0.19041.0</TargetFrameworks>
En el ejemplo siguiente se muestran los TFM para un proyecto de .NET 8:
<TargetFrameworks>net8.0-android;net8.0-ios;net8.0-maccatalyst;net8.0-tizen</TargetFrameworks>
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net8.0-windows10.0.19041.0</TargetFrameworks>
También se deben agregar referencias de paquete explícitas al archivo .csproj para los siguientes paquetes NuGet de .NET MAUI:
<ItemGroup>
<PackageReference Include="Microsoft.Maui.Controls" Version="$(MauiVersion)" />
<PackageReference Include="Microsoft.Maui.Controls.Compatibility" Version="$(MauiVersion)" />
</ItemGroup>
Se hace referencia a la variable $(MauiVersion)
desde la versión de .NET MAUI que has instalado. Para invalidar esto, agrega la propiedad build $(MauiVersion)
al archivo .csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net8.0-android;net8.0-ios;net8.0-maccatalyst</TargetFrameworks>
<UseMaui>True</UseMaui>
<MauiVersion>8.0.3</MauiVersion>
</PropertyGroup>
</Project>
Esto puede ser útil cuando se usan compilaciones ad hoc desde la fuente nocturna o compilaciones descargadas de solicitudes de incorporación de cambios.
Además, la propiedad de compilación $(ApplicationIdGuid)
se puede quitar del archivo .csproj en .NET 8. Para obtener más información, consulta Behavior changes.
Antes de compilar la aplicación actualizada por primera vez, elimina las carpetas bin
y obj
.
Nota:
La plantilla de proyecto de una aplicación de .NET MAUI en .NET 8 habilita el contexto que acepta valores NULL para el proyecto con la propiedad build $(Nullable)
. Para obtener más información,consulta Nullable.