Valeurs propres à la plateforme en XAML

Effectué

L’expérience visuelle de votre application sera différente sur chaque plateforme. Vous devrez souvent ajuster votre interface utilisateur pour chaque plateforme, en fonction des éléments visuels que vous utilisez. .NET MAUI vous permet de gérer la disposition de votre application en fonction de ces propriétés d’appareil.

Cette unité décrit les fonctionnalités que .NET MAUI fournit pour vous permettre de modifier l’interface utilisateur de vos applications en fonction de la plateforme sur laquelle elles s’exécutent.

Utilisation de la classe Device

La classe DeviceInfo est une classe utilitaire qui fournit des informations spécifiques de l’appareil sur lequel votre application s’exécute. Elle expose ces informations par le biais d’un ensemble de propriétés. La propriété la plus importante est DeviceInfo.Platform, qui retourne une chaîne indiquant le type d’appareil actuellement utilisé : Android, iOS, WinUI ou macOS.

Considérez le scénario suivant comme un exemple de cas où vous pourriez utiliser cette fonctionnalité. Le comportement par défaut d’une application iOS .NET MAUI est que le contenu ajouté à une page empiète sur la barre d’état iOS en haut de l’écran. Supposons que vous souhaitez modifier ce comportement. La solution la plus simple consiste à déplacer le contenu vers le bas dans la page. La solution Notes que vous avez créée dans l’exercice précédent résout ce problème en définissant la propriété Padding du contrôle VerticalStackLayout de façon à déplacer le contenu de 60 points :

<VerticalStackLayout x:Name="MyStackLayout" Padding="30,60,30,30">
    ...
</VerticalStackLayout>

Le souci est que ce problème n’apparaît que sur iOS. Déplacer le contenu à ce point sur Android et WinUI entraîne un gaspillage de l’espace d’écran disponible en haut de la page.

Vous pouvez interroger la propriété DeviceInfo.Platform pour résoudre ce problème d’affichage. Vous pouvez ajouter le code suivant au constructeur de page de votre application pour étendre la marge intérieure jusqu’en haut de la page, mais uniquement pour iOS :

MyStackLayout.Padding = 
    DeviceInfo.Platform == DevicePlatform.iOS
        ? new Thickness(30, 60, 30, 30) // Shift down by 60 points on iOS only
        : new Thickness(30); // Set the default margin to be 30 points

Remarque

DevicePlatform.iOS est un struct DevicePlatform qui retourne la valeur de chaîne iOS. Il existe des propriétés équivalentes pour les autres plateformes prises en charge. Vous devriez utiliser ces propriétés plutôt que des chaînes codées en dur. Il s’agit d’une bonne pratique qui permettra de protéger votre code si certaines de ces valeurs de chaîne changent à l’avenir.

Ce code fonctionne, mais il se trouve dans le fichier code-behind de la page. La marge intérieure est une valeur spécifique à l’interface utilisateur. En fait, il est plus approprié et plus pratique de procéder à partir du XAML plutôt qu’à partir du code-behind.

Utilisation de l’extension de balisage OnPlatform

Le langage XAML .NET MAUI fournit l’extension de balisage OnPlatform qui vous permet de détecter la plateforme d’exécution à partir de l’intérieur de votre code XAML. Vous pouvez appliquer cette extension de balisage dans le code XAML qui définit une valeur de propriété. L’extension requiert que vous fournissiez le type de la propriété, ainsi qu’une série de blocs On Platform dans lesquels vous définissez la valeur de la propriété en fonction de la plateforme.

Remarque

L’extension de balisage OnPlatform est générique. Elle prend un paramètre de type. Le type spécifié par l’attribut TypeArguments garantit que le type d’extension correct est utilisé.

Vous pouvez définir la Padding propriété comme ceci. Notez que le type de la propriété Padding est Thickness :

<VerticalStackLayout>
    <VerticalStackLayout.Padding>
        <OnPlatform x:TypeArguments="Thickness">
            <On Platform="iOS" Value="30,60,30,30" />
        </OnPlatform>
    </VerticalStackLayout.Padding>
    <!--XAML for other controls goes here -->
    ...
</VerticalStackLayout>

Pour des plateformes autres que iOS, la marge intérieure reste définie sur sa valeur par défaut, « 0.0.0.0 ». Pour WinUI et Android, vous pouvez définir la marge intérieure sur 30 points avec des blocs OnPlatform supplémentaires :

<VerticalStackLayout>
    <VerticalStackLayout.Padding>
        <OnPlatform x:TypeArguments="Thickness">
            <On Platform="iOS" Value="30,60,30,30" />
            <On Platform="Android" Value="30" />
            <On Platform="WinUI" Value="30" />
        </OnPlatform>
    </VerticalStackLayout.Padding>
    ...
</VerticalStackLayout>

Vous pouvez appliquer cette même technique à d’autres propriétés. L’exemple ci-dessous modifie la couleur d’arrière-plan de la disposition de pile dans une page en argent sur iOS, en vert sur Android et en jaune sur Windows.

<VerticalStackLayout>
    ...
    <VerticalStackLayout.BackgroundColor>
        <OnPlatform x:TypeArguments="Color">
            <On Platform="iOS" Value="Silver" />
            <On Platform="Android" Value="Green" />
            <On Platform="WinUI" Value="Yellow" />
        </OnPlatform>
    </VerticalStackLayout.BackgroundColor>
    ...
</VerticalStackLayout>

Cette syntaxe est un peu verbeuse, mais il existe une syntaxe réduite disponible pour l’extension OnPlatform. Vous pouvez simplifier l’exemple qui définit la marge intérieure comme suit :

<VerticalStackLayout Padding="{OnPlatform iOS='30,60,30,30', Default='30'}">
    <!--XAML for other controls goes here -->
</VerticalStackLayout>

Vous pouvez spécifier une valeur par défaut pour une propriété, ainsi que toutes les valeurs spécifiques à la plateforme. Dans cette forme, le paramètre de type est déduit de la propriété à laquelle l’attribut OnPlatform est appliqué.

Pour définir la couleur d’arrière-plan, vous pouvez utiliser ce fragment XAML à la place du deuxième exemple précédent :

<VerticalStackLayout BackgroundColor="{OnPlatform WinUI=Yellow, iOS=Silver, Android=Green}">
    ...
</VerticalStackLayout>

Contrôle des connaissances

1.

Quelle extension de balisage pouvez-vous utiliser dans votre code XAML pour détecter la plateforme sur laquelle l’application s’exécute ?

2.

Quel est l’objectif de l’attribut TypeArguments pour l’extension OnPlatform ?