La Syntaxe de XAML

Basée sur XML, elle definit un ensemble de balises et d'attributs représentants des objets d'interface et leurs présentation.

La syntaxe XML

XAML est un langage à balise dérivé de XML. Les composants graphiques sont définis par des balises ouvertes ou fermées, dotées d'attributs.

Exemple de balise avec contenu:

<TextBlock>
  Un texte
</TextBlock> 

et sans contenu:

<TextBlock />

Les attributs sont comme des variables, assignés par une valeur. En XML ces valeurs sont mises entre guillemets, contrairement au contenu qui est soit un texte, soit une ou plusieurs autres balises.
Par exemple nous donnons le nom t1 avec l'attribut Name:

<TextBlock Name="t1" />

<TextBlock Name="t1">
  Un texte
</TextBlock>

On verra que les balises peuvent contenir d'autres balises, et même que les attributs peuvent devenir des balises ou inversement, par exemple:

<TextBlock Text="Un texte" /> 

La syntaxe des propriétés

Une propriétés d'un objet, entendons par là ce qui le caractérise, peut s'écrire sous forme d'attribut. Par exemple la propriété de couleur de fond d'un rectangle s'écrit avec l'attribut Fill:

<Rectangle Fill="Red" /> 

Afin de décrire des propriétés complexes, XAML dispose d'un format alternative appelée "Property element syntax" (syntaxe d'élément propriété), qui étend la syntaxe de XML et donne au point une signification nouvelle.
En XML, la valeur d'un attribut doit être une chaîne de caractères. En XAML, ce peut être un autre objet du langage.
Mais on n'assigne pas directement l'objet à l'attribut avec le signe égal, on l'associe avec un point selon la syntaxe propre à XAML qui a la forme:

nomElement.nomPropriété

Reprenons l'exemple de l'objet Rectangle et la propriété Fill qui est la couleur de remplissage, l'attribut se transforme en balises:

<Rectangle> 
  <Rectangle.Fill>
  </Rectangle.Fill>
</Button>

Ce qui permet d'ajouter des balises et attributs à la propriété Fill, comme par exemple une texture faite avec une photo, ce que l'on verra plus tard dans ce manuel.

Un autre exemple est fourni par la spécification du langage, celui du bouton auquel on associe une liste déroulante:

<Button>
  <Button.ContextMenu>
    <ContextMenu>
      <MenuItem>
          Ouvrir
      </MenuItem>
      <MenuItem>
          Fermer
      </MenuItem>
    </ContextMenu>
  </Button.ContextMenu>
</Button>

On voit que ContextMenu, qui est une liste de menu, devient propriété de bouton grâce à "Button.ContextMenu", et se déclare à l'intérieur de la description du bouton.

Le contenu d'une balise peut être vu comme une propriété. Ainsi le texte du bouton est une propriété qui s'écrit en contenu ou comme valeur de l'attribut Text ou Content selon l'objet:

<TextBlock Text="Un texte" />

Les espaces de noms

Les espaces de noms sont spécificiés comme attributs du conteneur le plus global du fichier XAML, Canvas ou Window, ou Page. Ce sont des URL prédéfinies qui seront données dans les exemples et qui correspondent au type de définition XAML.
Exemple:

<Canvas
  xmlns="http://schemas.microsoft.com/client/2007" 
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">  

Pour les espaces de noms autres que l'espace par défaut (la première ligne), le préfixe (comme x ci-dessus) doit précéder chaque élément de cet espace de nom. En l'occurence on mettra:

x:nomElement

pour chaque élément de l'espace de nom x.

Les propriétés attachées

C'est un concept propre à XAML. La syntaxe est la même que pour les élements de propriété vus plus haut, on relie un nom de propriété à un nom de type (plutôt qu'à un nom d'élement tel que Button).

nomType.nomPropriété

Le but est d'ajouter des propriétés à un type. Les éléments de ce type pourront alors avoir les propriétés ainsi définies.

Evènements attachés

En XAML, on peut définir un évènement par un type, tandis que les gestionnaires d'évènements seront attachés aux objets représentés par des balises (telles que Button). La syntaxe est toujours la même:

nomType.nomEvènement   

Etendre le langage

Il est possible d'étendre le langage XAML grâce à une syntaxe particulière: on place entre { } l'extension, constituée du nom d'une classe suivi de l'instance.
Exemple pris dans la spécification du langage:

<TextBlock Style="{StaticResource MonStyle}">
  Un texte
</TextBlock>

La classe StaticResource contient les définitions ajoutées, et l'instance MonStyle devient une propriété de bouton. On pourra utiliser Button.MonStyle dans la définition du bouton et profiter des nouvelles possibilités implémentées dans la classe.

Caractéristiques et balises racines: Canvas, Page, Application.

Sensibilité à la casse

Espaces blancs

Balise racine

Plus d'informations