Syntaxe XAML essentielle
XAML est principalement conçu pour instancier et initialiser des objets. Mais souvent, les propriétés doivent être définies sur des objets complexes qui ne peuvent pas facilement être représentés en tant que chaînes XML, et parfois les propriétés définies par une classe doivent être définies sur une classe enfant. Ces deux besoins nécessitent les fonctionnalités de syntaxe XAML essentielles des éléments de propriété et des propriétés jointes.
Éléments de propriété
Dans le code XAML de l’interface utilisateur d’application multiplateforme .NET (.NET MAUI), les propriétés des classes sont normalement définies en tant qu’attributs XML :
<Label Text="Hello, XAML!"
VerticalOptions="Center"
FontAttributes="Bold"
FontSize="18"
TextColor="Aqua" />
Toutefois, il existe une autre façon de définir une propriété en XAML :
<Label Text="Hello, XAML!"
VerticalOptions="Center"
FontAttributes="Bold"
FontSize="18">
<Label.TextColor>
Aqua
</Label.TextColor>
</Label>
Ces deux exemples qui spécifient la TextColor
propriété sont fonctionnellement équivalents et permettent d’introduire une terminologie de base :
- Labelest un élément objet. Il s’agit d’un objet MAUI .NET exprimé en tant qu’élément XML.
Text
,VerticalOptions
FontAttributes
etFontSize
sont des attributs de propriété. Il s’agit de propriétés MAUI .NET exprimées sous forme d’attributs XML.- Dans le deuxième exemple,
TextColor
est devenu un élément de propriété. Il s’agit d’une propriété MAUI .NET exprimée en tant qu’élément XML.
Remarque
Dans un élément de propriété, la valeur de la propriété est toujours définie comme contenu entre les balises de début et de fin de l’élément de propriété.
La syntaxe d’élément de propriété peut également être utilisée sur plusieurs propriétés d’un objet :
<Label Text="Hello, XAML!"
VerticalOptions="Center">
<Label.FontAttributes>
Bold
</Label.FontAttributes>
<Label.FontSize>
Large
</Label.FontSize>
<Label.TextColor>
Aqua
</Label.TextColor>
</Label>
Bien que la syntaxe de l’élément de propriété semble inutile, il est essentiel que la valeur d’une propriété soit trop complexe pour être exprimée sous forme de chaîne simple. Dans les balises d’élément de propriété, vous pouvez instancier un autre objet et définir ses propriétés. Par exemple, la Grid disposition a des propriétés nommées RowDefinitions
et ColumnDefinitions
, qui sont de type RowDefinitionCollection
et ColumnDefinitionCollection
respectivement. Ces types sont des collections et ColumnDefinition
des objets, et vous utilisez généralement la syntaxe d’élément de RowDefinition
propriété pour les définir :
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="XamlSamples.GridDemoPage"
Title="Grid Demo Page">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="100" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="100" />
</Grid.ColumnDefinitions>
...
</Grid>
</ContentPage>
Propriétés jointes
Dans l’exemple précédent, vous avez vu que les Grid éléments de propriété requis pour les collections et ColumnDefinitions
les RowDefinitions
lignes définissent les lignes et les colonnes. Cela suggère qu’il doit y avoir une technique permettant d’indiquer la ligne et la colonne où réside chaque enfant du site Grid .
Dans la balise de chaque enfant de l’enfant Grid que vous spécifiez la ligne et la colonne de cet enfant à l’aide des Grid.Row
attributs et Grid.Column
des attributs, qui ont des valeurs par défaut de 0. Vous pouvez également indiquer si un enfant s’étend sur plusieurs lignes ou colonnes avec les attributs et Grid.ColumnSpan
les Grid.RowSpan
valeurs par défaut 1.
L’exemple suivant illustre le placement d’enfants dans un Grid:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="XamlSamples.GridDemoPage"
Title="Grid Demo Page">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="100" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="100" />
</Grid.ColumnDefinitions>
<Label Text="Autosized cell"
TextColor="White"
BackgroundColor="Blue" />
<BoxView Color="Silver"
Grid.Column="1" />
<BoxView Color="Teal"
Grid.Row="1" />
<Label Text="Leftover space"
Grid.Row="1" Grid.Column="1"
TextColor="Purple"
BackgroundColor="Aqua"
HorizontalTextAlignment="Center"
VerticalTextAlignment="Center" />
<Label Text="Span two rows (or more if you want)"
Grid.Column="2" Grid.RowSpan="2"
TextColor="Yellow"
BackgroundColor="Blue"
HorizontalTextAlignment="Center"
VerticalTextAlignment="Center" />
<Label Text="Span two columns"
Grid.Row="2" Grid.ColumnSpan="2"
TextColor="Blue"
BackgroundColor="Yellow"
HorizontalTextAlignment="Center"
VerticalTextAlignment="Center" />
<Label Text="Fixed 100x100"
Grid.Row="2" Grid.Column="2"
TextColor="Aqua"
BackgroundColor="Red"
HorizontalTextAlignment="Center"
VerticalTextAlignment="Center" />
</Grid>
</ContentPage>
Ce code XAML entraîne la disposition suivante :
Les Grid.Row
attributs , Grid.RowSpan
et Grid.ColumnSpan
les Grid.Column
attributs semblent être des propriétés de la Grid classe, mais cette classe ne définit rien nommé Row
, Column
, RowSpan
ou ColumnSpan
. Au lieu de cela, la Grid classe définit quatre propriétés pouvant être liées nommées RowProperty
, ColumnProperty
et RowSpanProperty
, et ColumnSpanProperty
qui sont des types spéciaux de propriétés pouvant être liées appelées propriétés jointes. Ils sont définis par la Grid classe mais définis sur les enfants du Grid.
Remarque
Lorsque vous souhaitez utiliser ces propriétés jointes dans le code, la Grid classe fournit des méthodes statiques nommées GetRow
, , GetColumn
SetRow
, , SetColumn
, GetRowSpan
, SetRowSpan
GetColumnSpan
et SetColumnSpan
.
Les propriétés jointes sont reconnaissables en XAML en tant qu’attributs contenant à la fois une classe et un nom de propriété séparés par un point. Elles sont appelées propriétés jointes, car elles sont définies par une classe (dans ce cas, Grid) mais attachées à d’autres objets (dans ce cas, enfants du Grid). Pendant la disposition, il Grid peut interroger les valeurs de ces propriétés jointes pour savoir où placer chaque enfant.
Propriétés du contenu
Dans l’exemple précédent, l’objet Grid a été défini sur la Content
propriété du ContentPage. Toutefois, la Content
propriété n’a pas été référencée dans le code XAML, mais peut être :
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="XamlSamples.XamlPlusCodePage"
Title="XAML + Code Page">
<ContentPage.Content>
<Grid>
...
</Grid>
</ContentPage.Content>
</ContentPage>
La Content
propriété n’est pas obligatoire en XAML, car les éléments définis pour une utilisation dans .NET MAUI XAML sont autorisés à avoir une propriété spécifiée comme ContentProperty
attribut sur la classe :
[ContentProperty("Content")]
public class ContentPage : TemplatedPage
{
...
}
Toute propriété spécifiée en tant que ContentProperty
classe signifie que les balises d’élément de propriété pour la propriété ne sont pas requises. Par conséquent, l’exemple ci-dessus spécifie que tout contenu XAML qui apparaît entre les balises de début et de fin ContentPage est affecté à la Content
propriété.
De nombreuses classes ont ContentProperty
également des définitions d’attributs. Par exemple, la propriété de contenu est Label Text
.
Différences de plateforme
Les applications .NET MAUI peuvent personnaliser l’apparence de l’interface utilisateur par plateforme. Cela peut être réalisé en XAML à l’aide des classes et On
des OnPlatform
classes :
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="...">
<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
est une classe générique et vous devez donc spécifier l’argument de type générique, dans ce cas, Thickness
qui est le type de Padding
propriété. Cela est obtenu avec l’attribut x:TypeArguments
XAML. La OnPlatform
classe définit une Default
propriété qui peut être définie sur une valeur qui sera appliquée à toutes les plateformes :
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="...">
<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>
Dans cet exemple, la Padding
propriété est définie sur différentes valeurs sur iOS et Android, avec les autres plateformes définies sur la valeur par défaut.
La OnPlatform
classe définit également une Platforms
propriété, qui est un IList
objet On
. Chaque On
objet peut définir la propriété et Value
la Platform
Thickness
valeur d’une plateforme spécifique. En outre, la Platform
propriété de On
type est de type IList<string>
, vous pouvez donc inclure plusieurs plateformes si les valeurs sont les mêmes :
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="...">
<ContentPage.Padding>
<OnPlatform x:TypeArguments="Thickness" Default="20">
<On Platform="iOS, Android" Value="10,20,20,10" />
</OnPlatform>
</ContentPage.Padding>
...
</ContentPage>
Il s’agit de la méthode standard pour définir une propriété dépendante de Padding
la plateforme en XAML.
Remarque
Si la Value
propriété d’un On
objet ne peut pas être représentée par une seule chaîne, vous pouvez définir des éléments de propriété pour celui-ci.
Pour plus d’informations, consultez Personnaliser l’apparence de l’interface utilisateur en fonction de la plateforme.
Étapes suivantes
Les extensions de balisage XAML .NET MAUI permettent aux propriétés d’être définies sur des objets ou des valeurs référencés indirectement à partir d’autres sources. Les extensions de balisage XAML sont particulièrement importantes pour le partage d’objets et le référencement des constantes utilisées dans une application.