Personalización de la apariencia de la interfaz de usuario en función de la plataforma y la expresión del dispositivo
Las aplicaciones de interfaz de usuario de aplicaciones multiplataforma de .NET (.NET MAUI) pueden tener su interfaz de usuario personalizada para plataformas y dispositivos específicos. Esto permite que la aplicación:
- Haga el uso más eficaz del espacio. Si diseña una aplicación para que se vea bien en un dispositivo móvil, la aplicación seguirá siendo utilizable en un dispositivo de escritorio, pero probablemente habrá algo de espacio desperdiciado. Puedes personalizar la aplicación para mostrar más contenido cuando la pantalla esté por encima de un tamaño determinado. Por ejemplo, una aplicación de compras podría mostrar un elemento a la vez en un dispositivo móvil, pero podría mostrar varios elementos en un dispositivo de escritorio. Además, al colocar más contenido en pantalla, puede reducir la cantidad de navegación que los usuarios necesitan realizar.
- Aproveche las funcionalidades del dispositivo. Es más probable que determinados dispositivos tengan ciertas funcionalidades. Por ejemplo, es más probable que los dispositivos móviles tengan un sensor de ubicación y una cámara, mientras que es posible que los dispositivos de escritorio no tengan ninguno de ellos. La aplicación puede detectar qué funcionalidades están disponibles y habilitar los controles que los usan.
- Optimice para la entrada. Puede reorganizar los elementos de la interfaz de usuario para optimizarlos para tipos de entrada específicos. Por ejemplo, si coloca elementos de navegación en la parte inferior de la aplicación, serán más fáciles de acceder a los usuarios móviles. Pero los usuarios de escritorio suelen esperar ver elementos de navegación hacia la parte superior de la aplicación.
Al optimizar la interfaz de usuario de la aplicación para plataformas específicas y expresiones de dispositivo, está creando una interfaz de usuario con capacidad de respuesta. El enfoque principal para crear una interfaz de usuario con capacidad de respuesta en .NET MAUI implica el uso de las clases OnPlatform<T> y OnIdiom<T>. Un enfoque alternativo consiste en usar las extensiones de marcado XAML OnPlatform
y OnIdiom
. Sin embargo, estas extensiones de marcado no son seguras. Para obtener más información sobre las extensiones de marcado, consulte Personalizar la apariencia de la interfaz de usuario con extensiones de marcado.
Nota
Hay una categoría de desencadenadores, conocidos como desencadenadores de estado, que se pueden usar para personalizar la apariencia de la interfaz de usuario en escenarios específicos, como cuando cambia la orientación de un dispositivo. Para obtener más información, consulte activador de estado.
Personalización de la apariencia de la interfaz de usuario en función de la plataforma
Las clases OnPlatform<T> y On permiten personalizar la apariencia de la interfaz de usuario por plataforma:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MyMauiApp.MainPage">
<ContentPage.Padding>
<OnPlatform x:TypeArguments="Thickness">
<On Platform="iOS" Value="0,20,0,0" />
<On Platform="Android" Value="10,20,20,10" />
</OnPlatform>
</ContentPage.Padding>
...
</ContentPage>
OnPlatform<T> es una clase genérica y, por tanto, debe especificar el argumento de tipo genérico, en este caso, Thickness, que es el tipo de propiedad Padding
. Esto se logra con el atributo XAML de x:TypeArguments
. La clase OnPlatform<T> define una propiedad Default que se puede establecer en un valor que se aplicará a todas las plataformas:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MyMauiApp.MainPage">
<ContentPage.Padding>
<OnPlatform x:TypeArguments="Thickness" Default="20">
<On Platform="iOS" Value="0,20,0,0" />
<On Platform="Android" Value="10,20,20,10" />
</OnPlatform>
</ContentPage.Padding>
...
</ContentPage>
En este ejemplo, la propiedad Padding
se establece en valores diferentes en iOS y Android, mientras que en las otras plataformas se utiliza el valor predeterminado.
La clase OnPlatform<T> también define una propiedad Platforms, que es un IList
de objetos On. Cada objeto On puede establecer la propiedad Platform y Value para definir el valor de Thickness para una plataforma específica. Además, la propiedad On.Platform es de tipo IList<string>
, por lo que puede incluir varias plataformas delimitadas por comas si los valores son los mismos:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MyMauiApp.MainPage">
<ContentPage.Padding>
<OnPlatform x:TypeArguments="Thickness" Default="20">
<On Platform="iOS, Android" Value="10,20,20,10" />
</OnPlatform>
</ContentPage.Padding>
...
</ContentPage>
Si se proporciona un valor de Platform incorrecto, no se producirá un error. En su lugar, el XAML se ejecutará sin que se aplique el valor específico de la plataforma.
Nota
Si la propiedad Value
de un objeto On
no se puede representar mediante una sola cadena, puede definir elementos de propiedad para él.
Personalización de la apariencia de la interfaz de usuario en función de la expresión del dispositivo
La clase OnIdiom<T> permite personalizar la apariencia de la interfaz de usuario en función de la expresión del dispositivo en el que se ejecuta la aplicación:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MyMauiApp.MainPage">
<ContentPage.Margin>
<OnIdiom x:TypeArguments="Thickness">
<OnIdiom.Phone>0,20,0,0</OnIdiom.Phone>
<OnIdiom.Tablet>0,40,0,0</OnIdiom.Tablet>
<OnIdiom.Desktop>0,60,0,0</OnIdiom.Desktop>
</OnPlatform>
</ContentPage.Margin>
...
</ContentPage>
OnIdiom<T> es una clase genérica y, por tanto, debe especificar el argumento de tipo genérico, en este caso, Thickness, que es el tipo de propiedad Margin
. Esto se logra con el atributo XAML de x:TypeArguments
. La clase OnIdiom<T> define una propiedad Default que se puede establecer en un valor que se aplicará a todas las plataformas:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MyMauiApp.MainPage">
<ContentPage.Margin>
<OnIdiom x:TypeArguments="Thickness" Default="20">
<OnIdiom.Desktop>0,60,0,0</OnIdiom.Desktop>
</OnPlatform>
</ContentPage.Margin>
...
</ContentPage>
En este ejemplo, la propiedad Margin
se establece en un valor específico en las expresiones de escritorio, con las otras expresiones que se establecen en el valor predeterminado.
Personalizar la apariencia de la interfaz de usuario con extensiones de marcado
La apariencia de la interfaz de usuario también se puede personalizar con las extensiones de marcado OnPlatform
y OnIdiom
. Sin embargo, estas extensiones de marcado no son seguras.
Personalización de la apariencia de la interfaz de usuario con una extensión de marcado basada en la plataforma
La extensión de marcado OnPlatform
le permite personalizar la apariencia de la interfaz de usuario por plataforma. Proporciona la misma funcionalidad que las clases OnPlatform<T> y On, pero con una representación más concisa.
La extensión de marcado OnPlatform
es compatible con la clase OnPlatformExtension, que define las siguientes propiedades:
-
Default
, de tipoobject
, que se establece en un valor predeterminado que se aplicará a las propiedades que representan las plataformas. -
Android
, de tipoobject
, que configuras a un valor para aplicar en Android. -
iOS
, de tipoobject
, que configuras a un valor para aplicar en iOS. -
MacCatalyst
, de tipoobject
, que usted establece en un valor que se aplicará en Mac Catalyst. -
Tizen
, de tipoobject
, al que se le asigna un valor para aplicar en la plataforma Tizen. -
WinUI
, de tipoobject
, que se establece en un valor que se aplicará en WinUI. -
Converter
, de tipo IValueConverter, que se puede configurar como una implementación de IValueConverter. -
ConverterParameter
, de tipoobject
, que se puede establecer en un valor para pasar a la implementación de IValueConverter.
Nota
El analizador XAML permite que la clase OnPlatformExtension se abrevia como OnPlatform
.
La propiedad Default
es la propiedad de contenido de OnPlatformExtension. Por lo tanto, para las expresiones de marcado XAML expresadas con llaves, puedes eliminar el segmento Default=
de la expresión si es el primer argumento. Si no se establece la propiedad Default
, el valor predeterminado es el valor de propiedad BindableProperty.DefaultValue
, siempre que la extensión de marcado tenga como destino un BindableProperty.
Importante
El analizador XAML espera que los valores del tipo correcto se proporcionen a las propiedades que consumen la extensión de marcado OnPlatform
. Si es necesaria la conversión de tipos, la extensión de marcado OnPlatform
intentará realizarla mediante los convertidores predeterminados proporcionados por .NET MAUI. Sin embargo, hay algunas conversiones de tipos que no se pueden realizar en los convertidores predeterminados y, en estos casos, la propiedad Converter
debe establecerse en una implementación de IValueConverter.
En el ejemplo XAML siguiente se muestra cómo usar la extensión de marcado OnPlatform
:
<BoxView Color="{OnPlatform Yellow, iOS=Red, Android=Green}"
WidthRequest="{OnPlatform 250, iOS=200, Android=300}"
HeightRequest="{OnPlatform 250, iOS=200, Android=300}"
HorizontalOptions="Center" />
En este ejemplo, las tres expresiones OnPlatform
usan la versión abreviada del nombre de clase OnPlatformExtension. Las tres extensiones de marcado OnPlatform
establecen las propiedades Color, WidthRequesty HeightRequest del BoxView en valores diferentes en iOS y Android. Las extensiones de marcado también proporcionan valores predeterminados para estas propiedades en las plataformas que no se especifican, al tiempo que eliminan la parte Default=
de la expresión.
Advertencia
La extensión de marcado OnPlatform
no es segura y no debe usarse con el trimming completo ni con NativeAOT. En su lugar, debe usar la clase OnPlatform<T> para personalizar la apariencia de la interfaz de usuario por plataforma. Para obtener más información, consulte Personalizar la apariencia de la interfaz de usuario en función de la plataforma, Recortar una aplicación .NET MAUI y implementación nativa de AOT.
Personalización de la apariencia de la interfaz de usuario con una extensión de marcado basada en la expresión del dispositivo
La extensión de marcado OnIdiom
permite personalizar la apariencia de la interfaz de usuario en función de la expresión del dispositivo en el que se ejecuta la aplicación. Proporciona la misma funcionalidad que la clase OnIdiom<T>, pero con una representación más concisa.
La extensión de marcado OnIdiom
es compatible con la clase OnIdiomExtension, que define las siguientes propiedades:
-
Default
, de tipoobject
, que se establece en un valor predeterminado que se aplicará a las propiedades que representan expresiones del dispositivo. -
Phone
, de tipoobject
, que usted configura a un valor que se aplicará en teléfonos. -
Tablet
, de tipoobject
, que se establece en un valor que se aplicará en tabletas. Esta propiedad no es exclusiva de plataformas Android e iOS. -
Desktop
, de tipoobject
, que estableces en un valor para aplicar en plataformas de escritorio. Tenga en cuenta que algunos portátiles pueden clasificarse mediante la propiedadTablet
. -
TV
, de tipoobject
, que configuras con un valor para ser aplicado en las plataformas de TV. -
Watch
, de tipoobject
, que se establece en un valor para aplicarse en plataformas Watch. -
Converter
, de tipo IValueConverter, puede configurarse como una implementación de IValueConverter. -
ConverterParameter
, de tipoobject
, que se puede establecer en un valor para pasar a la implementación de IValueConverter.
Nota
El analizador XAML permite que la clase OnIdiomExtension se abrevia como OnIdiom
.
La propiedad Default
es la propiedad de contenido de OnIdiomExtension. Por lo tanto, para las expresiones de marcado XAML expresadas con llaves, puedes eliminar la parte Default=
de la expresión si es el primer argumento.
Importante
El analizador XAML espera que los valores del tipo correcto se proporcionen a las propiedades que consumen la extensión de marcado OnIdiom
. Si es necesaria la conversión de tipos, la extensión de marcado OnIdiom
intentará realizarla mediante los convertidores predeterminados proporcionados por .NET MAUI. Sin embargo, hay algunas conversiones de tipos que no se pueden realizar en los convertidores predeterminados y, en estos casos, la propiedad Converter
debe establecerse en una implementación de IValueConverter.
En el ejemplo XAML siguiente se muestra cómo usar la extensión de marcado OnIdiom
:
<BoxView Color="{OnIdiom Yellow, Phone=Red, Tablet=Green, Desktop=Blue}"
WidthRequest="{OnIdiom 100, Phone=200, Tablet=300, Desktop=400}"
HeightRequest="{OnIdiom 100, Phone=200, Tablet=300, Desktop=400}"
HorizontalOptions="Center" />
En este ejemplo, las tres expresiones OnIdiom
usan la versión abreviada del nombre de clase OnIdiomExtension. Las tres extensiones de marcado de OnIdiom
establecen las propiedades Color, WidthRequesty HeightRequest de la BoxView en valores diferentes en las expresiones de teléfono, tableta y escritorio. Las extensiones de marcado también proporcionan valores predeterminados para estas propiedades en las expresiones que no se especifican, al tiempo que elimina la parte Default=
de la expresión.
Advertencia
La extensión de marcado OnIdiom
no es segura y no debe usarse con el recorte completo ni con NativeAOT. En su lugar, debe usar la clase OnIdiom<T> para personalizar la apariencia de la interfaz de usuario en función de la expresión del dispositivo en el que se ejecuta la aplicación. Para obtener más información, consulte Personalizar la apariencia de la interfaz de usuario en función del tipo de dispositivo, Optimizar una aplicación MAUI de .NET y AOT nativa.