Con la Preview 3 de NET MAUI llegan más novedades como:
- Añadidos más cambios relacionados con HostBuilder, clase Startup.
- Nueva API para gestionar el ciclo de vida de la aplicación.
- Añadidos mas controles (DatePicker, TimePicker, SearchBar, Stepper, etc).
- Añadidos mas cambios en Layouts.
- Añadidas nuevas APIs de accesibilidad.
- Primeros cambios añadiendo soporte para Windows usando WinUI 3.
En este artículo, vamos a hacer un repaso a todo lo que incluye la Preview 3, además de repasar que nos esperar en próximas Previews.
.NET MAUI Preview 3
Startup
Las aplicaciones .NET MAUI van a utilizar una clase Startup que permitirá:
- Incluye un método Configure para canalizar los procesos de registro de servicios, registro de handlers o personalización de la aplicación.
- Poder crear un HostBuilder personalizado.
Por ejemplo:
public void Configure(IAppHostBuilder appBuilder)
{
appBuilder = appBuilder
.UseCompatibilityRenderers()
.UseMauiApp<MyApp>();
}
Por defecto, si no quiere personalizar nada especial, o bien, quieres utilizar tu propio contenedor de dependencias, etc., podrás hacerlo.
Ciclo de vida
El ciclo de vida de una aplicación es sumamente importante. Hay muchas acciones que se deben realizar cuando la aplicación pasa a segundo plano, o bien cuando regresa de suspensión. Por lo tanto, tener un control detallado de cada paso es importante.
En .NET MAUI hay una nueva API para el ciclo de vida con el firme objetivo de cubrir todas las peticiones recibidas en Xamarin.Forms y mejorar las áreas donde las posibilidades necesitaban ser expandidas.
Por supuesto, al igual que en Xamarin.Forms podrás sobrecargar diferentes métodos para saber cuándo la aplicación pasa a segundo plano etc. Igualmente, se añaden mucho más control en el ciclo de vida de otros elementos como ventanas o Views.
Por otro lado, también se va a permitir conectar directamente con eventos nativos de cada plataforma. Veamos un ejemplo:
appBuilder
.ConfigureLifecycleEvents(events =>
{
events.AddEvent<Action<string>>("CustomEventName", value => LogEvent("CustomEventName"));
#if __ANDROID__
events.AddAndroid(android => android
.OnActivityResult((a, b, c, d) => LogEvent(nameof(AndroidLifecycle.OnActivityResult), b.ToString()))
.OnBackPressed((a) => LogEvent(nameof(AndroidLifecycle.OnBackPressed)))
.OnConfigurationChanged((a, b) => LogEvent(nameof(AndroidLifecycle.OnConfigurationChanged)))
.OnCreate((a, b) => LogEvent(nameof(AndroidLifecycle.OnCreate)))
.OnDestroy((a) => LogEvent(nameof(AndroidLifecycle.OnDestroy)))
.OnNewIntent((a, b) => LogEvent(nameof(AndroidLifecycle.OnNewIntent)))
.OnPause((a) => LogEvent(nameof(AndroidLifecycle.OnPause)))
.OnPostCreate((a, b) => LogEvent(nameof(AndroidLifecycle.OnPostCreate)))
.OnPostResume((a) => LogEvent(nameof(AndroidLifecycle.OnPostResume)))
.OnPressingBack((a) => LogEvent(nameof(AndroidLifecycle.OnPressingBack)) && false)
.OnRequestPermissionsResult((a, b, c, d) => LogEvent(nameof(AndroidLifecycle.OnRequestPermissionsResult)))
.OnRestart((a) => LogEvent(nameof(AndroidLifecycle.OnRestart)))
.OnRestoreInstanceState((a, b) => LogEvent(nameof(AndroidLifecycle.OnRestoreInstanceState)))
.OnResume((a) => LogEvent(nameof(AndroidLifecycle.OnResume)))
.OnSaveInstanceState((a, b) => LogEvent(nameof(AndroidLifecycle.OnSaveInstanceState)))
.OnStart((a) => LogEvent(nameof(AndroidLifecycle.OnStart)))
.OnStop((a) => LogEvent(nameof(AndroidLifecycle.OnStop))));
// Add some cool features/things
var shouldPreventBack = 1;
events.AddAndroid(android => android
.OnResume(a =>
{
LogEvent(nameof(AndroidLifecycle.OnResume), "shortcut");
})
.OnPressingBack(a =>
{
LogEvent(nameof(AndroidLifecycle.OnPressingBack), "shortcut");
return shouldPreventBack-- > 0;
})
.OnBackPressed(a => LogEvent(nameof(AndroidLifecycle.OnBackPressed), "shortcut"))
.OnRestoreInstanceState((a, b) =>
{
LogEvent(nameof(AndroidLifecycle.OnRestoreInstanceState), "shortcut");
Debug.WriteLine($"{b.GetString("test2", "fail")} == {b.GetBoolean("test", false)}");
})
.OnSaveInstanceState((a, b) =>
{
LogEvent(nameof(AndroidLifecycle.OnSaveInstanceState), "shortcut");
b.PutBoolean("test", true);
b.PutString("test2", "yay");
}));
}
Como puedes ver, recibimos información de cada evento nativo de una aplicación nativa Android. Si plugins se enlazan de esta forma con estos eventos, se notificará tanto al plugin como a tu propia subscripción. Esto hará que el uso de plugins dónde se requiere un control de ciclo de vida sea más sencillo sin necesidad de añadir código de inicialización, etc.
¿Qué te parece?
Novedades en accesibilidad
Añadir más control y mejorar la API de accesibilidad para evitar confusiones además de alinear el comportamiento en todos los casos y plataformas es una de las prioridades en unos de los apartados con tanta importancia como es la accesibilidad.
<Entry
Text="Entry text TH"
FontSize="14"
SemanticProperties.Description="Description text"
SemanticProperties.Hint="Hint text"/>
Se añade el concepto de SemanticProperties. Hablamos de una serie de propiedades que añaden información extra a Views para permitir interpretar correctamente que ocurre cuando se utiliza el lector de pantalla, o navegación por teclado.
Habrá más novedades en próximas Previews. Puedes ver mas información en la Spec.
Soporte a Windows
Con la llegada de la versión 0.5 de Project Reunion, incluimos soporte a Windows en .NET MAUI con WinUI 3:

Hasta aquí el pequeño repaso a algunas de las novedades en la Preview 3 de .NET MAUI. En la próxima Preview se esperan mas controles, novedades a nivel de UI, Microsoft Graphics y mucho más!. Por supuesto, estaremos aquí en el blog repasando con detallada cada novedad.
Más información
- GitHub: Ejemplos .NET 6