En codant mes premières lignes de Silverlight 2 beta 2, je me suis penchée sur les controls existant pour réaliser l'interface. Celui que j'apprécie le plus est le control Grid.
Voici un petit exemple qui permet d'illustrer le fonctionnement du control Grid. Pour ceux qui sont familiers des balises HTML <table>, son fonctionnement est basé sur la même logique, des lignes et des colonnes qui forment des cellules.
On cherche à réaliser cette interface :

Tout d'abord, lorsque l'on débute un projet Silverlight voici le XAML qui est généré :
1 2 3 4 5 6 7 8 |
<UserControl x:Class="GridDemoBlog.Page" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="400" Height="300"> <Grid x:Name="LayoutRoot" Background="White">
</Grid> </UserControl> |
On peut voir qu'un control Grid est déjà ajouté. Il représente toute l'interface disponible. En lui apportant des modifications, nous allons pouvoir poser la structure de base. Tout d'abord en ajoutant des lignes et des colonnes pour structurer les différentes cellules (pour mieux les visualiser nous allons mettre à la valeur True l'option ShowGridLines qui permet de mettre en évidence les séparations entre les lignes et les colones d'un control Grid).
Pour définir des lignes, il faut utiliser <Grid.RowDefinitions> et il y aura autant de lignes que de <RowDefinition> déclarés. Pour donner une taille relative, on utilise le caractère *, et le control utilisera toute la place possible.
Pour définir les colonnes, le principe est le même, il faut utiliser <Grid.ColumnDefinitions> et <ColumnDefinition> pour chaque colonne souhaitée. Dans notre exemple, nous avons une colonne de 40 pixels, et la deuxième qui prend le reste de la place de l'interface. Voici le code XAML correspondant :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<Grid x:Name="LayoutRoot" Background="White" ShowGridLines="True"> <Grid.RowDefinitions> <RowDefinition Height="*" /> <RowDefinition Height="*" /> <RowDefinition Height="*" /> </Grid.RowDefinitions>
<Grid.ColumnDefinitions> <ColumnDefinition Width="40" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> </Grid> |
Et voici ce que cela donne au niveau du designer :

Maintenant pour pouvoir travailler dans chaque cellule définie précédemment, il faut ajouter de nouveaux controls Grid, donc travailler avec des controls Grid imbriqués. Pour chaque control il faut lui renseigner dans quelle cellule il doit se positionner, c'est pour cela que l'on utilise les propriétés Grid.Column et Grid.Row.
Pour ce premier control Grid imbriqué, il est positionné à la ligne 0 et à la colonne 1 du Grid principal. Pour la première zone se composant d'une image et d'un bouton, il faut définir 2 colonnes, une première de taille 100 pour le control Image et une autre prenant le reste de la place disponible pour le control Button et y ajouter les controls correspondant.
Pour l'image, il faut la positionner dans la colonne 0 du control Grid "TopGrid". Pour le bouton, il faut le positionner dans la colonne 1 de ce même control Grid.
1 2 3 4 5 6 7 8 9 10 11 |
<Grid x:Name="TopGrid" Background="LightBlue" Grid.Row="0" Grid.Column="1"> <Grid.ColumnDefinitions> <ColumnDefinition Width="100" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions>
<Image x:Name="ImageSilverlight" Grid.Column="0" Source="Silverlight_logo.jpg" Stretch="Fill"/> <Button x:Name="ButtonDroit" Grid.Column="1" Content="Click me !" FontSize="20" Margin="5,5,5,5" />
</Grid> |
Et voici ce que cela donne au niveau du designer :

Pour le deuxième control Grid, il faut diviser en 2 lignes de hauteur identique, dans lesquelles un control <TextBlock> est ajouté pour afficher un texte. Chacun est associé à une ligne du control Grid "MiddleGrid" grâce à la propriété Grid.Row :
1 2 3 4 5 6 7 8 |
<Grid x:Name="MiddleGrid" Background="LightCyan" ShowGridLines="True" Grid.Row="1" Grid.Column="1"> <Grid.RowDefinitions> <RowDefinition Height="*" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <TextBlock Grid.Row="0" HorizontalAlignment="Left">Ligne du haut</TextBlock> <TextBlock Grid.Row="1" HorizontalAlignment="Right">Ligne du bas</TextBlock> </Grid> |
Et voici ce que cela donne au niveau du designer :

Pour le troisième control Grid, un control TextBlock suffit pour remplir toute la cellule donc il n'est pas utile de repréciser son emplacement dans le control Grid "BottomGrid" :
1 2 3 |
<Grid x:Name="BottomGrid" Background="LightSkyBlue" ShowGridLines="True" Grid.Row="2" Grid.Column="1"> <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="42">Hello World !</TextBlock> </Grid> |
Et voici ce que cela donne au niveau du designer :

Et enfin pour le quatrième control Grid, on souhait fusionner les cellules se trouvant sur 3 lignes, pour cela on se positionne sur la première cellule en ligne 0 et colonne 0 du control Grid principal, on se sert de la propriété Grid.RowSpan pour la fusion. Puis on ajoute un control Border avec des coins arrondis et un control TextBlock qui l'on fait pivoter pour écrire verticalement. Voici le code XAML correspondant :
1 2 3 4 5 6 7 8 |
<Grid x:Name="LeftGrid" ShowGridLines="True" Grid.Column="0" Grid.Row="0" Grid.RowSpan="3"> <Border CornerRadius="14" Background="LightSteelBlue" Margin="3,0,3,0" /> <TextBlock Foreground="White" VerticalAlignment="Center" HorizontalAlignment="Center" Text="Démo control Grid" Margin="-150,0,-150,0" RenderTransformOrigin="0.5,0.5"> <TextBlock.RenderTransform> <RotateTransform Angle="-90"/> </TextBlock.RenderTransform> </TextBlock> </Grid> |
Et voici ce que cela donne au niveau du designer :

Il ne reste plus qu'à mettre à False la propriété ShowGridLines et on obtient l'interface que l'on souhaitait au départ ! 