Professional Documents
Culture Documents
F5 . Lmu-
lateur se lance et nous voyons apparatre les nouvelles informations sur lcran (voir la
gure 3.3).
Figure 3.3 Rendu de lapplication dans lmulateur
La souris va ici permettre de simuler le toucher avec le doigt lorsque nous cliquons.
Cliquons donc dans la zone de texte et nous voyons apparatre un clavier virtuel
lintrieur de notre application (voir la gure 3.4).
Ce clavier virtuel sappelle le SIP (pour Soft Input Panel ) et apparait automatique-
ment quand on en a besoin, notamment dans les zones de saisie, nous y reviendrons.
Saisissons une valeur dans la zone de texte et cliquons sur le bouton Valider. Nous
voyons apparatre le rsultat en rouge avec un magnique message construit (voir la
gure 3.5).
Et voil, notre Hello World est termin ! Chouette non ? Pour quitter lapplication, le
plus simple est darrter le dbogueur de Visual Studio en cliquant sur le carr Stop.
32
HELLO WORLD
Figure 3.4 Le clavier virtuel dans lmulateur
Figure 3.5 Achage de lHello World dans lmulateur
33
CHAPITRE 3. NOTRE PREMIRE APPLICATION
Linterface en XAML
Alors, taper des choses sans rien comprendre, a va un moment. . . mais l, il est temps
de savoir ce que nous avons fait !
Nous avons dans un premier temps fait des choses dans le XAML. Pour rappel, le
XAML sert dcrire le contenu de ce que nous allons voir lcran. En fait, un chier
XAML correspond une page. Une application peut tre dcoupe en plusieurs pages,
nous y reviendrons plus tard. Ce que nous avons vu sur lmulateur est lachage de
la page MainPage.
Donc, nous avons utilis le XAML pour dcrire le contenu de la page. Il est globalement
assez explicite mais ce quil faut comprendre cest que nous avons ajout des contrles
du framework .NET dans la page. Un contrle est une classe C# complte qui sait
sacher, se positionner, traiter des vnements de lutilisateur (comme le clic sur le
bouton), etc. Ces contrles ont des proprits et peuvent tre ajouts dans le XAML.
Par exemple, prenons la ligne suivante :
1 <TextBlock Text="Saisir votre nom" HorizontalAlignment="Center"
/>
Nous demandons dajouter dans la page le contrle TextBlock - http://msdn.
microsoft.com/fr-fr/library/ms617591(v=vs.95).aspx. Le contrle TextBlock
correspond une zone de texte non modiable. Nous positionnons sa proprit Text
la chane de caractres Saisir votre nom . Ce contrle sera align au centre grce
la proprit HorizontalAlignment positionne Center. En fait, jai dit que nous
lajoutons dans la page, mais pour tre plus prcis, nous lajoutons dans le contrle
StackPanel qui est lui-mme contenu dans le contrle Grid, qui est contenu dans la
page. Nous verrons plus loin ce que sont ces contrles.
Ce que nous avons appel balise plus tt est en fait un contrle, et ce que
nous avons appel attribut correspond une proprit de ce contrle.
Derrire, automatiquement, cette ligne de XAML entrane la dclaration et linstancia-
tion dun objet de type TextBlock avec les aectations de proprits adquates. Puis
ce contrle est ajout dans le contrle StackPanel. Tout ceci nous est masqu. Grce
au XAML nous avons simplement dcrit linterface de la page et cest Visual Studio
qui sest occup de le transformer en C#. Parfait ! Moins on en fait et mieux on se
porte. . . et surtout il y a moins de risque derreurs.
Et cest pareil pour tous les autres contrles de la page, le TextBlock qui est une zone
de texte non modiable, le TextBox qui est une zone de texte modiable dclenchant
lachage du clavier virtuel, le bouton, etc.
Vous laurez peut-tre devin, mais cest pareil pour la page. Elle est dclare tout en
haut du chier XAML :
1 <phone:PhoneApplicationPage
2 x:Class="HelloWorld.MainPage"
34
LINTERFACE EN XAML
3 xmlns="http :// schemas.microsoft.com/winfx/2006/xaml/
presentation"
4 xmlns:x="http :// schemas.microsoft.com/winfx/2006/xaml"
5 xmlns:phone="clr -namespace:Microsoft.Phone.Controls;
assembly=Microsoft.Phone"
6 xmlns:shell="clr -namespace:Microsoft.Phone.Shell;assembly=
Microsoft.Phone"
7 xmlns:d="http :// schemas.microsoft.com/expression/blend/2008
"
8 xmlns:mc="http :// schemas.openxmlformats.org/markup -
compatibility/2006"
9 FontFamily="{StaticResource PhoneFontFamilyNormal}"
10 FontSize="{StaticResource PhoneFontSizeNormal}"
11 Foreground="{StaticResource PhoneForegroundBrush}"
12 SupportedOrientations="Portrait" Orientation="Portrait"
13 mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
14 shell:SystemTray.IsVisible="True">
Cest dailleurs le conteneur de base du chier XAML, celui qui contient tous les autres
contrles. La page est en fait reprsente par la classe PhoneApplicationPage qui
est aussi un objet du framework .NET. Plus prcisment, notre page est une classe
gnre qui drive de lobjet PhoneApplicationPage. Il sagit de la class MainPage
situe dans lespace de nom HelloWorld, cest ce que lon voit dans la proprit :
1 x:Class="HelloWorld.MainPage"
On peut sen rendre compte galement dans le code behind de la page o Visual Studio
a gnr une classe partielle du mme nom que le chier XAML et qui drive de
PhoneApplicationPage :
1 public partial class MainPage : PhoneApplicationPage
2 {
3 // Constructeur
4 public MainPage ()
5 {
6 InitializeComponent ();
7 }
8
9 private void Button_Tap_1(object sender , System.Windows.
Input.GestureEventArgs e)
10 {
11 Resultat.Text = "Bonjour " + Nom.Text;
12 }
13 }
Pourquoi partielle ? Parce quil existe un autre chier dans votre projet. Ce chier est
cach mais on peut lacher en cliquant sur le bouton en haut de lexplorateur de
solution (voir la gure 3.6).
Et nous pouvons voir notamment un rpertoire obj contenant un rpertoire debug
contenant le chier MainPage.g.i.cs. Si vous louvrez, vous pouvez trouver le code
35
CHAPITRE 3. NOTRE PREMIRE APPLICATION
Figure 3.6 Achage des chiers cachs dans lexplorateur de solutions
suivant :
1 public partial class MainPage : Microsoft.Phone.Controls.
PhoneApplicationPage
2 {
3 internal System.Windows.Controls.Grid LayoutRoot;
4 internal System.Windows.Controls.StackPanel TitlePanel;
5 internal System.Windows.Controls.Grid ContentPanel;
6 internal System.Windows.Controls.TextBox Nom;
7 internal System.Windows.Controls.TextBlock Resultat;
8
9 private bool _contentLoaded;
10
11 /// <summary >
12 /// InitializeComponent
13 /// </summary >
14 [System.Diagnostics.DebuggerNonUserCodeAttribute ()]
15 public void InitializeComponent ()
16 {
17 if (_contentLoaded)
18 {
19 return;
20 }
21 _contentLoaded = true;
22 System.Windows.Application.LoadComponent(this , new
System.Uri("/HelloWorld;component/MainPage.xaml",
36
LE CODE-BEHIND EN C#
System.UriKind.Relative));
23 this.LayoutRoot = (( System.Windows.Controls.Grid)(this.
FindName("LayoutRoot")));
24 this.TitlePanel = (( System.Windows.Controls.StackPanel)
(this.FindName("TitlePanel")));
25 this.ContentPanel = (( System.Windows.Controls.Grid)(
this.FindName("ContentPanel")));
26 this.Nom = (( System.Windows.Controls.TextBox)(this.
FindName("Nom")));
27 this.Resultat = (( System.Windows.Controls.TextBlock)(
this.FindName("Resultat")));
28 }
29 }
Il sagit dune classe qui est gnre lorsquon modie le chier XAML. Ne modiez
pas ce chier car il sera re-gnr tout le temps. On peut voir quil sagit dune classe
MainPage, du mme nom que la proprit x:Class de tout lheure, qui soccupe de
charger le chier XAML et qui cre des variables partir des contrles quil trouvera
dedans. Nous voyons notamment quil a cr les deux variables suivantes :
1 internal System.Windows.Controls.TextBox Nom;
2 internal System.Windows.Controls.TextBlock Resultat;
Le nom de ces variables correspond aux proprits x:Name des deux contrles que nous
avons cr :
1 <TextBox x:Name="Nom" />
2 <TextBlock x:Name="Resultat" Foreground="Red" />
Ces variables sont initialises aprs quil ait charg tout le XAML en faisant une re-
cherche partir du nom du contrle. Cela veut dire que nous disposons dune variable
qui permet daccder au contrle de la page, par exemple la variable Nom du type
TextBox. Je vais y revenir. Nous avons donc :
Un chier MainPage.xaml qui contient la description des contrles
Un chier gnr qui contient une classe partielle qui drive de
PhoneApplicationPage et qui charge ce XAML et qui rend accessible nos
contrles via des variables
Un chier de code behind qui contient la mme classe partielle o nous pourrons
crire la logique de notre code
Remarquez quil existe galement le chier MainPage.g.cs qui correspond au chier
gnr aprs la compilation. Nous ne nous occuperons plus de ces chiers gnrs, ils ne
servent plus rien. Nous les avons regards pour comprendre comment cela fonctionne.
Le code-behind en C#
Revenons sur le code behind, donc sur le chier MainPage.xaml.cs, nous avons :
1 public partial class MainPage : PhoneApplicationPage
37
CHAPITRE 3. NOTRE PREMIRE APPLICATION
2 {
3 // Constructeur
4 public MainPage ()
5 {
6 InitializeComponent ();
7 }
8
9 private void Button_Tap_1(object sender , System.Windows.
Input.GestureEventArgs e)
10 {
11 Resultat.Text = "Bonjour " + Nom.Text;
12 }
13 }
On retrouve bien notre classe partielle qui hrite des fonctionnalits de la classe
PhoneApplicationPage. Regardez lintrieur de la mthode Button_Tap_1, nous
utilisons les fameuses variables que nous navons pas dclar nous-mme mais qui ont
t gnres. . . Ce sont ces variables qui nous permettent de manipuler nos contrles
et en loccurrence ici, qui nous permettent de modier la valeur de la zone de texte
non modiable en concatnant la chane Bonjour la valeur de la zone de texte
modiable, accessible via sa proprit Text.
Vous aurez compris ici que ce sont les proprits Text des TextBlock et TextBox qui
nous permettent daccder au contenu qui est ach sur la page. Il existe plein dautres
proprits pour ces contrles comme la proprit Foreground qui permet de modier
la couleur du contrle, sauf quici nous lavions positionn grce au XAML :
1 <TextBlock x:Name="Resultat" Foreground="Red" />
Chose que nous aurions galement pu faire depuis le code behind :
1 private void Button_Tap_1(object sender , System.Windows.Input.
GestureEventArgs e)
2 {
3 Resultat.Foreground = new SolidColorBrush(Colors.Red);
4 Resultat.Text = "Bonjour " + Nom.Text;
5 }
Sachez quand mme que dune manire gnrale, on aura tendance essayer de mettre
le plus de chose possible dans le XAML plutt que dans le code behind. La proprit
Foreground ici a tout intrt tre dclare dans le XAML.
Le contrle Grid
Je vais y revenir plus loin un peu plus loin, mais pour que vous ne soyez pas compl-
tement perdu dans notre Hello World, il faut savoir que la Grid est un conteneur.
38
LE CONTRLE STACKPANEL
<mode bilingue = on>Vous aurez compris que la Grid est en fait une
grille. . .<mode bilingue = o >
Aprs cet eort de traduction intense, nous pouvons dire que la grille sert contenir
et agencer dautres contrles. Dans notre cas, le code suivant :
1 <Grid x:Name="LayoutRoot" Background="Transparent">
2 <Grid.RowDefinitions >
3 <RowDefinition Height="Auto"/>
4 <RowDefinition Height="*"/>
5 </Grid.RowDefinitions >
6
7 <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,
0,28">
8 <TextBlock Text="MON APPLICATION" Style="{
StaticResource PhoneTextNormalStyle}" Margin="12,0"
/>
9 <TextBlock Text="Hello World" Margin="9,-7,0,0" Style="
{StaticResource PhoneTextTitle1Style}"/>
10 </StackPanel >
11
12 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12 ,0,12,0"
>
13 <StackPanel >
14 <TextBlock Text="Saisir votre nom"
HorizontalAlignment="Center" />
15 <TextBox x:Name="Nom" />
16 <Button Content="Valider" Tap="Button_Tap_1" />
17 <TextBlock x:Name="Resultat" Foreground="Red" />
18 </StackPanel >
19 </Grid >
20 </Grid >
Dni une grille qui contient deux lignes. La premire contient un contrle StackPanel,
nous allons en parler juste aprs. La seconde ligne contient une nouvelle grille sans ligne
ni colonne, qui est galement compose dun StackPanel. Nous aurons loccasion den
parler plus longuement plus tard donc je marrte l pour linstant sur la grille.
Le contrle StackPanel
Ici cest pareil, le contrle StackPanel est galement un conteneur. Je vais y revenir un
peu plus loin galement mais il permet ici daligner les contrles les uns en dessous des
autres. Par exemple, celui que nous avons rajout contient un TextBlock, un TextBox,
un bouton et un autre TextBlock :
1 <StackPanel >
2 <TextBlock Text="Saisir votre nom" HorizontalAlignment="
Center" />
39
CHAPITRE 3. NOTRE PREMIRE APPLICATION
3 <TextBox x:Name="Nom" />
4 <Button Content="Valider" Tap="Button_Tap_1" />
5 <TextBlock x:Name="Resultat" Foreground="Red" />
6 </StackPanel >
Nous pouvons voir sur le designer que les contrles sont bien les uns en dessous des
autres. Nous avons donc au nal, la page qui contient une grille, qui contient un
StackPanel et une grille qui contiennent chacun des contrles.
Le contrle TextBox
Le contrle TextBox est une zone de texte modiable. Nous lavons utilise pour saisir
le prnom de lutilisateur. On dclare ce contrle ainsi :
1 <TextBox x:Name="Nom" />
Lorsque nous cliquons dans la zone de texte, le clavier virtuel apparait et nous ore
la possibilit de saisir une valeur. Nous verrons un peu plus loin quil est possible de
changer le type du clavier virtuel. La valeur saisie est rcupre via la proprit Text
du contrle, par exemple ici je rcupre la valeur saisie que je concatne la chane
Bonjour et que je stocke dans la variable resultat :
1 string resultat = "Bonjour " + Nom.Text;
Inversement, je peux pr-remplir la zone de texte avec une valeur en utilisant la pro-
prit Text, par exemple depuis le XAML :
1 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12 ,0,12 ,0">
2 <StackPanel >
3 <TextBox x:Name="Nom" Text="Nicolas" />
4 </StackPanel >
5 </Grid >
Ce qui donne la gure 3.7.
La mme chose est faisable en code behind, il sut dinitialiser la proprit de la
variable dans le constructeur de la page :
1 public partial class MainPage : PhoneApplicationPage
2 {
3 public MainPage ()
4 {
5 InitializeComponent ();
6 Nom.Text = "Nicolas";
7 }
8 }
videmment, il sera toujours possible de modier la valeur pr-remplie grce au clavier
virtuel.
40
LE CONTRLE TEXTBLOCK
Figure 3.7 La valeur du TextBox sache dans la fentre de rendu
Le contrle TextBlock
Le contrle TextBlock reprsente une zone de texte non modiable. Nous lavons utilis
pour acher le rsultat de notre Hello World. Il sut dutiliser sa proprit Text pour
acher un texte. Par exemple, le XAML suivant :
1 <TextBlock Text="Je suis un texte non modifiable de couleur
rouge" Foreground="Red" FontSize="25" />
ache la fentre de prvisualisation prsente dans la gure 3.8.
Je peux modier la couleur du texte grce la proprit Foreground. Cest la mme
chose pour la taille du texte, modiable via la proprit FontSize. Nous pouvons
remarquer que le texte que jai saisi dpasse de lcran et que nous ne le voyons pas en
entier. Pour corriger a, jutilise la proprit TextWrapping que je positionne Wrap :
1 <TextBlock Text="Je suis un texte non modifiable de couleur
rouge" Foreground="Red" FontSize="25" TextWrapping="Wrap" />
Comme nous lavons dj fait, il est possible de modier la valeur dun TextBlock en
passant par le code-behind :
1 Resultat.Text = "Bonjour " + Nom.Text;
41
CHAPITRE 3. NOTRE PREMIRE APPLICATION
Figure 3.8 Le texte sache en rouge dans le TextBlock
Les vnements
Il sagit des vnements sur les contrles. Chaque contrle est capable de lever une srie
dvnements lorsque cela est opportun. Cest le cas par exemple du contrle bouton qui
est capable de lever un vnement lorsque nous tapotons dessus (ou que nous cliquons
avec la souris). Nous lavons vu dans lexemple du Hello World, il sut de dclarer une
mthode que lon associe lvnement, par exemple :
1 <Button Content="Valider" Tap="Button_Tap_1" />
qui permet de faire en sorte que la mthode Button_Tap_1 soit appele lors du clic sur
le bouton. Rappelez-vous, dans notre Hello World, nous avions la mthode suivante :
1 private void Button_Tap_1(object sender , System.Windows.Input.
GestureEventArgs e)
2 {
3 Resultat.Text = "Bonjour " + Nom.Text;
4 }
Il est galement possible de sabonner un vnement via le code behind, il sut
davoir une variable de type bouton, pour cela donnons un nom un bouton :
1 <Button x:Name="UnBouton" Content="Cliquez -moi" />
Et dassocier une mthode lvnement de clic :
42
LES VNEMENTS
1 public partial class MainPage : PhoneApplicationPage
2 {
3 public MainPage ()
4 {
5 InitializeComponent ();
6
7 UnBouton.Tap += UnBouton_Tap;
8 }
9
10 void UnBouton_Tap(object sender , System.Windows.Input.
GestureEventArgs e)
11 {
12 throw new NotImplementedException ();
13 }
14 }
Il existe beaucoup dvnements de ce genre, par exemple la case cocher (CheckBox)
permet de sabonner lvnement qui est dclench lorsquon coche la case :
1 <CheckBox Content="Cochez -moi" Checked="CheckBox_Checked_1" />
Avec la mthode :
1 private void CheckBox_Checked_1(object sender , RoutedEventArgs
e)
2 {
3
4 }
Il existe normment dvnement sur les contrles, mais aussi sur la page, citons encore
par exemple lvnement qui permet dtre noti lors de la n du chargement de la
page :
1 public MainPage ()
2 {
3 InitializeComponent ();
4 Loaded += MainPage_Loaded;
5 }
6
7 private void MainPage_Loaded(object sender , RoutedEventArgs e)
8 {
9 throw new NotImplementedException ();
10 }
Nous aurons loccasion de voir beaucoup dautres vnements tout au long de ce cours.
Remarquez que les vnements sont toujours construits de la mme faon. Le premier
paramtre est du type object et reprsente le contrle qui a dclench lvnement.
En loccurrence, dans lexemple suivant :
1 <Button Content="Valider" Tap="Button_Tap_1" />
Nous pouvons accder au contrle de cette faon :
43
CHAPITRE 3. NOTRE PREMIRE APPLICATION
1 private void Button_Tap_1(object sender , System.Windows.Input.
GestureEventArgs e)
2 {
3 Button bouton = (Button)sender;
4 bouton.Content = "C'est valid !";
5 }
Le second paramtre est, quant lui, spcique au type dvnement et peut fournir
des informations complmentaires.
Le bouton
Revenons prsent rapidement sur le bouton, nous lavons vu il nest pas trs compliqu
utiliser. On utilise la proprit Content pour mettre du texte et il est capable de lever
un vnement lorsquon clique dessus, grce lvnement Tap. Le bouton possde
galement un vnement Click qui fait la mme chose et qui existe encore pour des
raisons de compatibilit avec Silverlight.
Prfrez cependant lvnement Tap qui est plus performant.
Il est galement possible de passer des paramtres un bouton. Pour un bouton tout
seul, ce nest pas toujours utile, mais dans certaines situations cela peut tre primordial.
Dans lexemple qui suit, jutilise deux boutons qui ont la mme mthode pour traiter
lvnement de clic sur le bouton :
1 <StackPanel >
2 <Button Content="Afficher" Tap="Button_Tap"
CommandParameter="Nicolas" />
3 <Button Content="Afficher" Tap="Button_Tap"
CommandParameter="Jrmie" />
4 <TextBlock x:Name="Resultat" Foreground="Red" />
5 </StackPanel >
Cest la proprit CommandParameter qui me permet de passer un paramtre. Je pour-
rais ensuite lutiliser dans mon code behind :
1 private void Button_Tap(object sender , System.Windows.Input.
GestureEventArgs e)
2 {
3 Button bouton = (Button)sender;
4 bouton.IsEnabled = false;
5 Resultat.Text = "Bonjour " + bouton.CommandParameter;
6 }
Jutilise ainsi le paramtre CommandParameter pour rcuprer le prnom de la personne
qui dire bonjour (voir la gure 3.9).
44
ET SILVERLIGHT DANS TOUT A?
Figure 3.9 Passage dun paramtre au bouton sachant dans lmulateur
Remarquez au passage lutilisation de la proprit IsEnabled qui permet dindiquer si
un contrle est activ ou pas. Si un bouton est dsactiv, il ne pourra pas tre cliqu.
Et Silverlight dans tout a ?
Vous avez remarqu que jai parl de Silverlight et de XAML. Quelle dirence ?
Pour bien comprendre, Silverlight tait utilis pour dvelopper avec les versions 7 de
Windows Phone. On utilise par contre le XAML/C# pour dvelopper pour la version
8. En fait, grosso modo cest la mme chose.
XAML est lvolution de Silverlight. Si vous avez des connaissances en Silverlight, vous
vous tes bien rendu compte que ce quon appelle aujourdhui XAML/C#, cest pareil.
Il sagit juste dun changement de vocabulaire an dunier les dveloppements utilisant
du code XAML pour dnir linterface dune application, quelle soit Windows Phone
ou Windows . . .
Ce qui est valable avec Silverlight lest aussi avec XAML/C#, et inversement propor-
tionnel.
45
CHAPITRE 3. NOTRE PREMIRE APPLICATION
En rsum
Le XAML permet de dcrire linterface de nos pages.
Le code behind permet dcrire le code C# de la logique de nos pages.
On utilise des contrles dans nos interfaces, comme le bouton ou la zone de
texte.
Les contrles sont des classes compltes qui savent sacher, se positionner ou
ragir des vnements utilisateurs, comme le clic sur un bouton.
46
Chapitre 4
Les contrles
Dicult :
Jusqu prsent nous avons vu peu de contrles, la zone de texte non modiable, la zone de
saisie modiable, le bouton. . . Il existe beaucoup de contrles disponibles dans les biblio-
thques de contrles XAML pour Windows Phone. Ceux-ci sont facilement visibles grce
la boite outils que lon retrouve gauche de lcran.
Voyons un peu ce quil y a autour de ces fameux contrles.
47
CHAPITRE 4. LES CONTRLES
Gnralits sur les contrles
Il y a plusieurs types de contrles, ceux-ci drivent tous dune classe de base
abstraite qui sappelle UIElement - http://msdn.microsoft.com/fr-fr/library/
system.windows.uielement(v=vs.95).aspx qui sert grer tout ce qui doit pou-
voir sacher et qui est capable de ragir une interaction simple de lutilisa-
teur. Mais la classe UIElement ne fait pas grand-chose sans la classe abstraite
drive FrameworkElement - http://msdn.microsoft.com/fr-fr/library/system.
windows.frameworkelement(v=vs.95).aspx qui fournit tous les composants de base
pour les objets qui doivent sacher sur une page. Cest cette classe galement qui
gre toute la liaison de donnes que nous dcouvrirons un peu plus tard. Cest donc
de cette classe que drivent deux grandes familles de contrles : les contrles propre-
ment parler et les panneaux. Les panneaux drivent de la classe abstraite de base
Panel - http://msdn.microsoft.com/fr-fr/library/system.windows.controls.
panel(v=vs.95).aspx et servent comme conteneurs permettant de grer le placement
des contrles. Nous allons y revenir dans un prochain chapitre. Les contrles drivent de
la classe abstraite Control - http://msdn.microsoft.com/fr-fr/library/system.
windows.controls.control(v=vs.95).aspx. Elle sert de classe de base pour tous les
lments qui utilisent un modle pour dnir leur apparence. Nous y reviendrons plus
tard, mais une des grandes forces du XAML est dorir la possibilit de changer lap-
parence dun contrle, tout en conservant ses fonctionnalits. Les contrles qui hritent
de la classe Control peuvent se rpartir en trois grandes catgories.
Ceux qui drivent de la classe ContentControl - http://msdn.microsoft.com/
fr-fr/library/system.windows.controls.contentcontrol(v=vs.95).aspx
et qui permettent de contenir dautres objets. Cest le cas du bouton par exemple,
nous y reviendrons.
Il y a galement les contrles qui drivent de la classe ItemsControl
- http://msdn.microsoft.com/fr-fr/library/system.windows.controls.
itemscontrol(v=vs.95).aspx, qui servent acher une liste dlments, cest
le cas de la ListBox par exemple, nous ltudierons plus loin.
Et enn, il reste les contrles qui drivent directement de la classe Control, qui
ne contiennent pas dautres contrles ou qui nachent pas de liste dlments,
comme par exemple le TextBlock ou le TextBox que nous avons vu.
Pour schmatiser, nous pouvons observer ce schma (incomplet) la gure 4.1.
Une dernire remarque avant de terminer, sur lutilisation des proprits. Nous avons
vu lcriture suivante pour par exemple modier la valeur de la proprit Text du
contrle TextBlock :
1 <TextBlock Text="Hello world" />
Il est galement possible dcrire la proprit Text de cette faon :
1 <TextBlock >
2 <TextBlock.Text >
3 Hello world
4 </TextBlock.Text >
5 </TextBlock >
48
UTILISER LE DESIGNER POUR AJOUTER UN CHECKBOX
Figure 4.1 Hirarchie de classe pour les contrles
Cette criture nous sera trs utile lorsque nous aurons besoin de mettre des choses plus
complexes que des chanes de caractres dans nos proprits. Nous y reviendrons. Enn,
une proprit possde gnralement une valeur par dfaut. Cest pour cela que notre
TextBox sait sacher mme si on ne lui prcise que sa proprit Text, elle possde
une couleur dcriture par dfaut, une taille dcriture par dfaut, etc.
Utiliser le designer pour ajouter un CheckBox
Revenons notre boite outils remplie de contrle. Elle se trouve gauche de lcran,
ainsi que vous pouvez le voir sur la gure 4.2.
Grce au designer, vous pouvez faire glisser un contrle de la bote outils dans le
rendu de la page. Celui-ci se positionnera automatiquement.
Prenons par exemple le contrle de case cocher que nous avons entre-aperu un peu
plus tt : CheckBox. Slectionnez-le et faites le glisser sur le rendu de la page (voir la
gure 4.3).
Le designer ma automatiquement gnr le code XAML correspondant :
1 <CheckBox Content="CheckBox" HorizontalAlignment="Left" Margin=
"168 ,167 ,0,0" VerticalAlignment="Top"/>
Vous aurez srement des valeurs lgrement direntes, notamment au niveau de la
proprit Margin. Cest dailleurs en utilisant ces valeurs que le designer a pu me
positionner le contrle dans la grille. Remarquons que si javais fait glisser un Canvas
et ensuite la case cocher dans ce Canvas, jaurais plutt eu du code comme le suivant :
1 <Canvas HorizontalAlignment="Left" Height="100" Margin="102 ,125
,0,0" VerticalAlignment="Top" Width="100">
49
CHAPITRE 4. LES CONTRLES
Figure 4.2 La bote outils des contrles dans Visual Studio
50
UTILISER LE DESIGNER POUR AJOUTER UN CHECKBOX
Figure 4.3 Ajout dun contrle CheckBox partir du designer
2 <CheckBox Content="CheckBox" Canvas.Left="56" Canvas.Top="
40"/>
3 </Canvas >
Ici, il a utilis la proprit Canvas.Top et Canvas.Left pour positionner la case
cocher. Nous allons revenir sur ce positionnement un peu plus loin.
Il est possible de modier les proprits de la case cocher, par exemple son contenu,
en allant dans la fentre de Proprits (voir la gure 4.4).
Si la fentre de proprits nest pas ache, vous pouvez la faire apparaitre
en allant dans le menu Affichage, Fentre proprits.
Ici, je change la valeur de la proprit Content. Je peux observer les modications sur
le rendu et dans le XAML. Remarquons que le designer est un outil utile pour crer
son rendu, par contre il ne remplace pas une bonne connaissance du XAML an de
grer correctement le positionnement.
51
CHAPITRE 4. LES CONTRLES
Figure 4.4 Modication des proprits dun contrle partir de la fentre des pro-
prits
Utiliser Expression Blend pour ajouter un ToggleBut-
ton
Jaurais aussi pu faire la mme chose dans Expression Blend qui est loutil de design
professionnel. Jai galement accs la bote outils (voir la gure 4.5).
Et de la mme faon, je peux faire glisser un contrle, disons le ToggleButton, sur
ma page. Jai galement accs ses proprits an de les modier. Ici, par exemple, je
modie la couleur du ToggleButton (voir la gure 4.6).
Une fois revenu dans Visual Studio, je peux voir les modications apportes depuis
Blend, avec par exemple dans mon cas :
1 <ToggleButton Content="ToggleButton" HorizontalAlignment="Left"
Margin="111 ,169 ,0,0" VerticalAlignment="Top" Background="#
FFF71616" BorderBrush="#FF2DC50C"/>
Nous reviendrons sur Blend tout au long de ce cours.
En rsum
Il existe tout une hirarchie des contrles utilisables dans nos pages.
Les contrles sont accessibles depuis la barre doutils de Visual Studio ou dans
expression blend.
52
UTILISER EXPRESSION BLEND POUR AJOUTER UN TOGGLEBUTTON
Figure 4.5 Barre doutils des contrles dans Blend
Figure 4.6 Modication des couleurs du ToggleButton dans Blend
53
CHAPITRE 4. LES CONTRLES
Le designer de Visual Studio et celui de Blend peuvent nous faciliter la tche
dans le design de nos applications.
54
Chapitre 5
Le clavier virtuel
Dicult :
Le clavier virtuel est ce petit clavier qui apparat lorsque lon clique dans une zone de texte
modiable, que nous avons pu voir dans notre Hello World. En anglais il se nomme le SIP,
pour Soft Input Panel, que lon traduit par clavier virtuel. Nous allons voir comment nous
en servir.
55
CHAPITRE 5. LE CLAVIER VIRTUEL
Acher le clavier virtuel
Vous vous rappelez de notre Hello World? Lorsque nous avons cliqu dans le TextBox,
nous avons vu apparatre ce fameux clavier virtuel (voir la gure 5.1).
Figure 5.1 Achage du clavier virtuel
Il ny a quune seule solution pour acher le clavier virtuel. Il faut que lutilisateur
clique dans une zone de texte modiable. Et ce moment-l, le clavier virtuel apparat
en bas de lcran. Techniquement, il sache quand le contrle TextBox prend le focus
(lorsque lon clique dans le contrle) et il disparat lorsque celui-ci perd le focus (lors-
quon clique en dehors du contrle). Il nest pas possible de dclencher son achage
par programmation, ni son masquage, part en manipulant le focus. Pour acher un
TextBox, on utilisera le XAML suivant :
1 <TextBox x:Name="MonTextBox" />
Intercepter les touches du clavier virtuel
Comme dj dit, il nest pas possible de manipuler le clavier. Par contre, on peut savoir
quand une touche est appuye en utilisant lvnement KeyDown ou KeyUp du TextBox.
Il sagit dvnements qui sont levs lorsquon appuie sur une touche ou lorsquon
relche la touche. Prenons par exemple le code suivant :
56
LES DIFFRENTS TYPES DE CLAVIER
1 <StackPanel >
2 <TextBox x:Name="MonTextBox" KeyDown="MonTextBox_KeyDown"
KeyUp="MonTextBox_KeyUp" />
3 <TextBlock x:Name="Statut" />
4 </StackPanel >
Et le code behind :
1 private void MonTextBox_KeyDown(object sender , KeyEventArgs e)
2 {
3 Statut.Text = "Touche appuye : " + e.Key;
4 }
5
6 private void MonTextBox_KeyUp(object sender , KeyEventArgs e)
7 {
8 Statut.Text = "Touche relache : " + e.Key;
9 }
Nous aurons la gure 5.2.
Figure 5.2 Achage de la touche relache dans lmulateur
Les dirents types de clavier
Le clavier que nous avons vu est le clavier par dfaut. Nous avons notre disposition
dautres types de clavier, par exemple un clavier numrique permettant de saisir des
57
CHAPITRE 5. LE CLAVIER VIRTUEL
numros de tlphone (voir la gure 5.3).
Figure 5.3 Clavier virtuel de type numrique
Pour choisir le type de clavier acher, nous allons utiliser la proprit InputScope
du contrle TextBox. Par exemple, pour acher le clavier numrique, je vais utiliser :
1 <TextBox x:Name="MonTextBox" InputScope="Number" />
La liste des dirents claviers supports est disponible ici - http://msdn.microsoft.
com/fr-fr/library/system.windows.input.inputscopenamevalue.aspx.
Cela permet davoir un clavier plus adapt, si lon doit par exemple permettre de saisir
un @ pour un email, ou des caractres spciaux, etc. Sur la gure 5.4, vous pouvez
voir un clavier optimis pour la saisie dun email (type EmailUserName), avec un
arrobas (@) et un .fr .
En rsum
Le clavier virtuel sache lorsque lon clique dans une zone de texte modiable.
Il existe plusieurs types de clavier notre disposition que nous pouvons choisir
grce la proprit InputScope.
58
LES DIFFRENTS TYPES DE CLAVIER
Figure 5.4 Clavier virtuel optimis pour la saisie dadresse email
59
CHAPITRE 5. LE CLAVIER VIRTUEL
60
Chapitre 6
Les conteneurs et le placement
Dicult :
Dans notre Hello World, lorsque nous avons parl du contrle TextBlock, nous avons dit
quil faisait partie du contrle StackPanel qui lui-mme faisait partie du contrle Grid. Ces
deux contrles sont en fait des conteneurs de contrles dont lobjectif est de regrouper des
contrles de direntes faons.
Les contrles conteneurs vont tre trs utiles pour organiser le look et lagencement de nos
pages. Il y en a quelques uns indispensables dcouvrir qui vont constamment vous servir
lors des vos dveloppements. Nous allons prsent les dcouvrir et voir comment nous en
servir.
61
CHAPITRE 6. LES CONTENEURS ET LE PLACEMENT
StackPanel
Le StackPanel par exemple, comme son nom peut le suggrer, permet dempiler les
contrles les uns la suite des autres. Dans lexemple suivant, les contrles sont ajouts
les uns en-dessous des autres :
1 <StackPanel >
2 <TextBlock Text="Bonjour tous" />
3 <Button Content="Cliquez -moi" />
4 <Image Source="http ://open -e-education -2013.openclassrooms.
com/img/logos/logo -openclassrooms.png" />
5 </StackPanel >
Ce qui donne la gure 6.1.
Figure 6.1 Empilement vertical des contrles grce au StackPanel
O nous achons un texte, un bouton et une image. Nous verrons un peu plus prci-
sment le contrle Image dans le chapitre suivant.
Notons au passage que Visual Studio et lmulateur peuvent trs facilement rcuprer
des contenus sur internet, sauf si vous utilisez un proxy. Ici par exemple, en utilisant
lURL dune image, je peux lacher sans problme dans mon application, si celle-ci
est connecte internet bien sr.
Le contrle StackPanel peut aussi empiler les contrles horizontalement. Pour cela, il
sut de changer la valeur dune de ses proprits :
62
STACKPANEL
1 <StackPanel Orientation="Horizontal">
2 <TextBlock Text="Bonjour tous" />
3 <Button Content="Cliquez -moi" />
4 <Image Source="http ://open -e-education -2013.openclassrooms.
com/img/logos/logo -openclassrooms.png" />
5 </StackPanel >
Ici, nous avons chang lorientation de lempilement pour la mettre en horizontal. Ce
qui donne la gure 6.2.
Figure 6.2 Empilement horizontal des contrles
Ce qui ne rend pas trs bien ici. . . Pour lamliorer, nous pouvons ajouter dautres
proprits nos contrles, notamment les rduire en hauteur ou en largeur grce aux
proprits Height ou Width. Par exemple :
1 <StackPanel Orientation="Horizontal" Height="40">
2 <TextBlock Text="Bonjour tous" />
3 <Button Content="Cliquez -moi" />
4 <Image Source="http ://open -e-education -2013.openclassrooms.
com/img/logos/logo -openclassrooms.png" />
5 </StackPanel >
Ici, jai rajout une hauteur pour le contrle StackPanel, en xant la proprit Height
40 pixels, ce qui fait que tous les sous-contrles se sont adapts cette hauteur. Nous
aurons donc la gure 6.3.
63
CHAPITRE 6. LES CONTENEURS ET LE PLACEMENT
Figure 6.3 Les contrles ont la taille xe 40 pixels
Par dfaut, le contrle StackPanel essaie doccuper le maximum de place disponible
dans la grille dont il fait partie. Comme nous avons forc la hauteur, le StackPanel
va alors se centrer. Il est possible daligner le StackPanel en haut grce la proprit
VerticalAlignment :
1 <StackPanel Orientation="Horizontal" Height="40"
VerticalAlignment="Top">
2 <TextBlock Text="Bonjour tous" />
3 <Button Content="Cliquez -moi" />
4 <Image Source="http ://open -e-education -2013.openclassrooms.
com/img/logos/logo -openclassrooms.png" />
5 </StackPanel >
Ce qui donne la gure 6.4.
Nous allons revenir sur lalignement un peu plus loin. Voil pour ce petit tour du
StackPanel !
ScrollViewer
Il existe dautres conteneurs, voyons par exemple le ScrollViewer. Il nous sert rendre
accessible des contrles qui pourraient tre masqus par un cran trop petit. Prenons
par exemple ce code XAML :
64
SCROLLVIEWER
Figure 6.4 Alignement vertical en haut du StackPanel
1 <ScrollViewer >
2 <StackPanel >
3 <TextBlock Text="Bonjour tous 1" Margin="40" />
4 <TextBlock Text="Bonjour tous 2" Margin="40" />
5 <TextBlock Text="Bonjour tous 3" Margin="40" />
6 <TextBlock Text="Bonjour tous 4" Margin="40" />
7 <TextBlock Text="Bonjour tous 5" Margin="40" />
8 <TextBlock Text="Bonjour tous 6" Margin="40" />
9 <TextBlock Text="Bonjour tous 7" Margin="40" />
10 </StackPanel >
11 </ScrollViewer >
Nous crons 7 contrles TextBlock, contenant une petite phrase, qui doivent se mettre
les uns en-dessous des autres. Vous aurez devin que la proprit Margin permet de
dnir une marge autour du contrle, jy reviendrai. Si nous regardons le rsultat, nous
pouvons constater quil nous manque un TextBlock (voir la gure 6.5).
Vous vous en doutez, il sache trop bas et nous ne pouvons pas le voir sur lcran car
il y a trop de choses. Le ScrollViewer va nous permettre de rsoudre ce problme. Ce
contrle gre une espce de dlement, comme lorsque nous avons un ascenseur dans
nos pages web. Ce qui fait quil sera possible de naviguer de haut en bas sur notre
mulateur en cliquant sur lcran et en maintenant le clic tout en bougeant la souris
de haut en bas (voir la gure 6.6).
65
CHAPITRE 6. LES CONTENEURS ET LE PLACEMENT
Figure 6.5 Il manque un contrle lcran
Figure 6.6 Le ScrollViewer permet de faire dler lcran
66
GRID
Vous pouvez galement vous amuser faire dler le ScrollViewer horizontalement,
mais il vous faudra changer une proprit :
1 <ScrollViewer HorizontalScrollBarVisibility="Auto">
2 <StackPanel Orientation="Horizontal">
3 ...
Grid
Parlons prsent du contrle Grid. Cest un contrle trs utilis qui va permettre
de positionner dautres contrles dans une grille. Une grille peut tre dnie par des
colonnes et des lignes. Il sera alors possible dindiquer dans quelle colonne ou quelle
ligne se positionne un contrle. Par exemple, avec le code suivant :
1 <Grid >
2 <Grid.RowDefinitions >
3 <RowDefinition Height="*" />
4 <RowDefinition Height="*" />
5 <RowDefinition Height="*" />
6 </Grid.RowDefinitions >
7 <Grid.ColumnDefinitions >
8 <ColumnDefinition Width="*" />
9 <ColumnDefinition Width="*" />
10 <ColumnDefinition Width="*" />
11 </Grid.ColumnDefinitions >
12 <TextBlock Text="O" FontSize="50" Grid.Row="0" Grid.Column=
"0" HorizontalAlignment="Center" VerticalAlignment="
Center" />
13 <TextBlock Text="O" FontSize="50" Grid.Row="0" Grid.Column=
"1" HorizontalAlignment="Center" VerticalAlignment="
Center" />
14 <TextBlock Text="O" FontSize="50" Grid.Row="0" Grid.Column=
"2" HorizontalAlignment="Center" VerticalAlignment="
Center" />
15 <TextBlock Text="X" FontSize="50" Grid.Row="1" Grid.Column=
"0" HorizontalAlignment="Center" VerticalAlignment="
Center" />
16 <TextBlock Text="O" FontSize="50" Grid.Row="1" Grid.Column=
"1" HorizontalAlignment="Center" VerticalAlignment="
Center" />
17 <TextBlock Text="X" FontSize="50" Grid.Row="1" Grid.Column=
"2" HorizontalAlignment="Center" VerticalAlignment="
Center" />
18 <TextBlock Text="O" FontSize="50" Grid.Row="2" Grid.Column=
"0" HorizontalAlignment="Center" VerticalAlignment="
Center" />
19 <TextBlock Text="X" FontSize="50" Grid.Row="2" Grid.Column=
"1" HorizontalAlignment="Center" VerticalAlignment="
Center" />
67
CHAPITRE 6. LES CONTENEURS ET LE PLACEMENT
20 <TextBlock Text="X" FontSize="50" Grid.Row="2" Grid.Column=
"2" HorizontalAlignment="Center" VerticalAlignment="
Center" />
21 </Grid >
Je dnis une grille compose de 3 lignes sur 3 colonnes. Dans chaque case je pose un
TextBlock avec une valeur qui me simule un jeu de morpion. Ce quil est important de
remarquer ici cest que je dnis le nombre de colonnes grce ColumnDefinition :
1 <Grid.ColumnDefinitions >
2 <ColumnDefinition Width="*" />
3 <ColumnDefinition Width="*" />
4 <ColumnDefinition Width="*" />
5 </Grid.ColumnDefinitions >
De la mme faon, je dnis le nombre de lignes grce RowDefinition :
1 <Grid.RowDefinitions >
2 <RowDefinition Height="*" />
3 <RowDefinition Height="*" />
4 <RowDefinition Height="*" />
5 </Grid.RowDefinitions >
Il y a donc 3 colonnes et 3 lignes. Chaque colonne a une largeur dun tiers de lcran.
Chaque ligne a une hauteur dun tiers de lcran. Je vais y revenir juste aprs. Pour in-
diquer quun contrle est la ligne 1 de la colonne 2, jutiliserai les proprits Grid.Row
et Grid.Column avec les valeurs 1 et 2. ( noter quon commence numroter partir
de 0, classiquement). Ce qui donnera la gure 6.7.
Pratique non ? Nous pouvons voir aussi que dans la dnition dune ligne, nous po-
sitionnons la proprit Height. Cest ici que nous indiquerons la hauteur de chaque
ligne. Cest la mme chose pour la largeur des colonnes, cela se fait avec la proprit
Width sur chaque ColomnDefinition.
Ainsi, en utilisant ltoile, nous avons dit que nous voulions que le XAML soccupe de
rpartir toute la place disponible. Il y a trois toiles, chaque ligne et colonne a donc
un tiers de la place pour sacher. Dautres valeurs sont possibles. Il est par exemple
possible de forcer la taille une valeur prcise. Par exemple, si je modie lexemple
prcdent pour avoir :
1 <Grid.RowDefinitions >
2 <RowDefinition Height="*" />
3 <RowDefinition Height="200" />
4 <RowDefinition Height="*" />
5 </Grid.RowDefinitions >
6 <Grid.ColumnDefinitions >
7 <ColumnDefinition Width="100" />
8 <ColumnDefinition Width="*" />
9 <ColumnDefinition Width="50" />
10 </Grid.ColumnDefinitions >
68
GRID
Figure 6.7 Une grille de 3x3
Jindiquerai ici que la premire colonne aura une taille xe de 100, la troisime une
taille xe de 50 et la deuxime prendra la taille restante. De la mme faon, pour les
lignes, la deuxime est force 200 et les deux autres se rpartiront la taille restante,
savoir la moiti chacune.
Jen prote pour vous rappeler quun tlphone Windows Phone 7.5 a une rsolution
de 480 en largeur et de 800 en hauteur et quun tlphone Windows Phone 8 possde
trois rsolutions :
WVGA (800x480 pixels), comme Windows Phone 7.5
WXVGA (1280x768)
True 720p (1280x720)
Ainsi, sur un tlphone en WVGA la deuxime colonne aura une taille de 480 100
50 = 330. Ce qui donne une grille plutt disgracieuse, mais tant donn que chaque
contrle est align au centre, cela ne se verra pas trop. Pour bien le mettre en valeur, il
est possible de rajouter une proprit la grille lui indiquant que nous souhaitons voir
les lignes. Bien souvent, cette proprit ne servira qu des ns de dbogages. Il sut
dindiquer :
1 <Grid ShowGridLines="True">
Par contre, les lignes sachent uniquement dans lmulateur car le designer montre
dj ce que a donne (voir la gure 6.8).
69
CHAPITRE 6. LES CONTENEURS ET LE PLACEMENT
Figure 6.8 Achage des lignes de la grille
Il est bien sr possible de faire en sorte quun contrle stende sur plusieurs colonnes
ou sur plusieurs lignes, ce moment-l, on utilisera la proprit Grid.ColumnSpan ou
Grid.RowSpan pour indiquer le nombre de colonnes ou lignes que lon doit fusionner.
Par exemple :
1 <TextBlock Text="X" FontSize="50" Grid.Row="1" Grid.Column="0"
HorizontalAlignment="Center" VerticalAlignment="Center" Grid
.ColumnSpan="3" />
la place de :
1 <TextBlock Text="X" FontSize="50" Grid.Row="1" Grid.Column="0"
HorizontalAlignment="Center" VerticalAlignment="Center" />
2 <TextBlock Text="O" FontSize="50" Grid.Row="1" Grid.Column="1"
HorizontalAlignment="Center" VerticalAlignment="Center" />
3 <TextBlock Text="X" FontSize="50" Grid.Row="1" Grid.Column="2"
HorizontalAlignment="Center" VerticalAlignment="Center" />
Et nous avons donc la gure 6.9.
Avant de terminer sur les lignes et les colonnes, il est important de savoir quil existe une
autre valeur pour dnir la largeur ou la hauteur, savoir la valeur Auto. Elle permet
de dire que cest la largeur ou la hauteur des contrles qui vont dnir la hauteur dune
ligne ou dune colonne. Remarquez que par dfaut, un contrle sachera la ligne 0
et la colonne 0 tant que son Grid.Row ou son Grid.Column nest pas dni. Ainsi la
ligne suivante :
70
CANVAS
Figure 6.9 Une grille avec une case stirant sur 3 colonnes
1 <TextBlock Text="X" FontSize="50" Grid.Row="0" Grid.Column="0"
/>
est quivalente celle-ci :
1 <TextBlock Text="X" FontSize="50" />
Voil pour ce petit tour de ce contrle si pratique quest la grille.
Canvas
Nous nirons notre aperu des conteneurs avec le Canvas. Au contraire des autres
conteneurs qui calculent eux mme la position des contrles, ici cest le dveloppeur qui
indique lemplacement dun contrle, de manire relative la position du Canvas. De
plus le Canvas ne calculera pas automatiquement sa hauteur et sa largeur en analysant
ses enfants, contrairement aux autres conteneurs. Ainsi si on met dans un StackPanel
un Canvas suivi dun bouton, le bouton sera ach par-dessus le Canvas, car ce dernier
aura une hauteur de 0 bien quil possde des enfants. Ainsi, lexemple suivant :
1 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12 ,0,12,0">
2 <Canvas >
3 <TextBlock Text="Je suis en bas gauche" Canvas.Top="
500" />
71
CHAPITRE 6. LES CONTENEURS ET LE PLACEMENT
4 <TextBlock Text="Je suis en haut droite" Canvas.Left=
"250" Canvas.Top="10"/>
5 </Canvas >
6 </Grid >
achera la gure 6.10.
Figure 6.10 Positionnement absolu avec le Canvas
Nous nous servons des proprits Canvas.Top et Canvas.Left pour indiquer la position
du contrle relativement au Canvas.
Cest sans doute le conteneur qui permet le placement le plus simple comprendre, par
contre ce nest pas forcment le plus ecace, surtout pour sadapter plusieurs rsolu-
tions ou lorsque nous retournerons lcran. Jen parlerai un peu plus loin. Remarquons
quune page doit absolument commencer par avoir un conteneur comme contrle racine
de tous les autres contrles. Cest ce que gnre par dfaut Visual Studio lorsquon cre
une nouvelle page. Il y met en loccurrence un contrle Grid.
Alignement
Lalignement permet de dnir comment est align un contrle par rapport son
contenant, en gnral un panneau. Il existe plusieurs valeurs pour cette proprit :
Stretch (tir) qui est la valeur par dfaut
Left (gauche)
72
MARGES ET ESPACEMENT
Right (droite)
Center (centre)
Ainsi le code XAML suivant :
1 <Grid >
2 <TextBlock Text="Gauche -Haut" HorizontalAlignment="Left"
VerticalAlignment="Top" />
3 <TextBlock Text="Centre -Haut" HorizontalAlignment="Center"
VerticalAlignment="Top" />
4 <TextBlock Text="Droite -Haut" HorizontalAlignment="Right"
VerticalAlignment="Top" />
5 <TextBlock Text="Gauche -Centre" HorizontalAlignment="Left"
VerticalAlignment="Center" />
6 <TextBlock Text="Centre -Centre" HorizontalAlignment="Center
" VerticalAlignment="Center" />
7 <TextBlock Text="Droite -Centre" HorizontalAlignment="Right"
VerticalAlignment="Center" />
8 <TextBlock Text="Gauche -Bas" HorizontalAlignment="Left"
VerticalAlignment="Bottom" />
9 <TextBlock Text="Centre -Bas" HorizontalAlignment="Center"
VerticalAlignment="Bottom" />
10 <TextBlock Text="Droite -Bas" HorizontalAlignment="Right"
VerticalAlignment="Bottom" />
11 </Grid >
produira le rsultat que vous pouvez voir la gure 6.11.
Lorsquon utilise la valeur Stretch, les valeurs des proprits Width et Height peuvent
annuler leet de ltirement. On peut voir cet eet avec le code suivant :
1 <Grid >
2 <Button Content="Etir en largeur" Height="100"
VerticalAlignment="Top" />
3 <Button Content="Etir en hauteur" Width="300"
HorizontalAlignment="Left" />
4 </Grid >
Qui nous donne la gure 6.12.
Bien sr, un bouton avec que du Stretch remplirait ici tout lcran.
Les proprits dalignements nont pas dimpact dans un Canvas.
Marges et espacement
Avant de terminer, je vais revenir rapidement sur les marges. Je les ai rapidement
voques tout lheure. Pour mieux les comprendre, regardons cet exemple :
73
CHAPITRE 6. LES CONTENEURS ET LE PLACEMENT
Figure 6.11 Les dirents alignements
Figure 6.12 Ltirement est annul par les proprits Height et Width
74
MARGES ET ESPACEMENT
1 <StackPanel >
2 <Rectangle Height="40" Fill="Yellow" />
3 <StackPanel Orientation="Horizontal">
4 <TextBlock Text="Mon texte" />
5 <Rectangle Width="100" Fill="Yellow" />
6 </StackPanel >
7 <Rectangle Height="40" Fill="Yellow" />
8 </StackPanel >
Il donne la gure 6.13.
Figure 6.13 Un TextBlock sans marge
En rajoutant une marge au TextBlock, nous pouvons voir concrtement se dcaler le
texte :
1 <TextBlock Text="Mon texte" Margin="50"/>
Qui donne la gure 6.14.
Figure 6.14 Une marge de 50 autour du TextBlock
En fait, la marge prcdente rajoute une marge de 50 gauche, en haut, droite et en
bas. Ce qui est lquivalent de :
1 <TextBlock Text="Mon texte" Margin="50 50 50 50"/>
75
CHAPITRE 6. LES CONTENEURS ET LE PLACEMENT
Il est tout fait possible de choisir de mettre des marges direntes pour, respective-
ment, la marge gauche, en haut, droite et en bas :
1 <TextBlock Text="Mon texte" Margin="0 10 270 100"/>
Qui donne la gure 6.15.
Figure 6.15 La marge peut tre de taille dirente en haut, en bas, gauche ou
droite du contrle
Bref, les marges aident positionner le contrle lemplacement voulu, trs utile pour
avoir un peu despace dans un StackPanel. Remarquez que nous avons aperu dans
ces exemples le contrle Rectangle qui permet, vous vous en doutez, de dessiner un
rectangle. Nous ltudierons un peu plus loin.
En rsum
Les conteurs contiennent des contrles et nous sont utiles pour les positionner
sur la page.
Chaque page doit possder un unique conteneur racine.
Les proprits dalignement, de marge et despacement nous permettent daner
nos positionnements dans les conteneurs.
76
Chapitre 7
Ajouter du style
Dicult :
Nous avons vu quon pouvait modier les couleurs, la taille de lcriture. . . grce la fentre
des proprits dun contrle. Cela modie les proprits des contrles et aecte leur rendu.
Cest trs bien. Mais imaginons que nous voulions changer les couleurs et lcriture de
plusieurs contrles, il va falloir reproduire ceci sur tous les contrles, ce qui dun coup est
plutt moins bien !
Cest l quintervient le style. Il correspond lidentication de plusieurs proprits par un
nom, que lon peut appliquer facilement plusieurs contrles.
77
CHAPITRE 7. AJOUTER DU STYLE
Acher des images
Pour commencer, nous allons reparler du contrle Image. Ce nest pas vraiment un style
proprement parler, mais il va tre trs utile pour rendre nos pages un peu plus jolies.
Nous lavons rapidement utilis en montrant quil tait trs simple dacher une image
prsente sur internet simplement en indiquant lURL de celle-ci. Il est galement trs
facile dacher des images nous, embarques dans lapplication. Pour cela, jutilise
une petite image toute bte, reprsentant un cercle rouge (voir la gure 7.1).
Figure 7.1 Un cercle rouge sur fond blanc
Pour suivre cet exemple avec moi, je vous conseille de tlcharger cette image, en
cliquant ici - http://uploads.siteduzero.com/files/410001_411000/410620.png.
Ajoutons donc cette image la solution. Pour cela, je vais commencer par crer un
nouveau rpertoire Images sous le rpertoire Assets qui a t ajout lors de la cration
de la solution. Ensuite, nous allons ajouter un lment existant en faisant un clic droit
sur le projet. Je slectionne limage qui sajoute automatiquement la solution.
Jai cr un rpertoire pour que mes images soient mieux ranges et pour
illustrer le chemin daccs de celles-ci, mais ce nest pas du tout une tape
obligatoire.
Ici, il faut faire attention ce que dans les proprits de limage, laction de gnration
soit Contenu, ce qui est le paramtre par dfaut pour les projets ciblant Windows
Phone 8, mais pas Windows Phone 7 o cest laction de gnration Resource qui est
le paramtre par dfaut. Contenu permet dindiquer que limage sera un chier part,
non intgre lassembly, nous y reviendrons la n de la partie (voir la gure 7.2).
Nous pourrons alors trs simplement acher limage en nous basant sur lURL relative
de limage dans la solution :
1 <Image x:Name="MonImage" Source="/Assets/Images/rond.png" Width
="60" Height="60" />
noter que cela peut aussi se faire grce au code behind. Pour cela, supprimons la
proprit Source du XAML :
1 <Image x:Name="MonImage" Width="60" Height="60" />
Et chargeons limage dans le code de cette faon :
1 MonImage.Source = new BitmapImage(new Uri("/Assets/Images/rond.
png", UriKind.Relative));
78
AFFICHER DES IMAGES
Figure 7.2 Limage doit avoir son action de gnration Contenu
79
CHAPITRE 7. AJOUTER DU STYLE
Remarque : pour utiliser la classe BitmapImage - http://msdn.microsoft.com/fr-fr/
library/system.windows.media.imaging.bitmapimage(v=vs.95).aspx, il faut ajou-
ter le using suivant :
1 using System.Windows.Media.Imaging;
Cela semble moins pratique, mais je vous lai prsent car nous utiliserons cette mthode
un petit peu plus loin. Dune manire gnrale, il sera toujours plus pertinent de passer
par le XAML que par le code !
Il nest pas possible dacher des images GIF dans ce contrle lorsquon
dveloppe pour Windows Phone 7.5, seuls les formats JPG et PNG sont
supports. Par contre, le GIF est utilisable pour des projets Windows Phone
8 mais ne sanime pas.
Les ressources
Les ressources sont un mcanisme de XAML qui permet de rutiliser facilement des
objets ou des valeurs. Chaque classe qui drive de FrameworkElement dispose dune
proprit Resources, qui est en fait un dictionnaire de ressources. Chaque contrle
peut donc avoir son propre dictionnaire de ressources mais en gnral, on dnit les
ressources soit au niveau de la page, soit au niveau de lapplication. Par exemple, pour
dnir une ressource au niveau de la page, nous utiliserons la syntaxe suivante :
1 <phone:PhoneApplicationPage
2 x:Class="HelloWorld.MainPage"
3 xmlns="http :// schemas.microsoft.com/winfx/2006/xaml/
presentation"
4 [... plein de choses ...]
5 shell:SystemTray.IsVisible="True">
6
7 <phone:PhoneApplicationPage.Resources >
8 <SolidColorBrush x:Key="BrushRouge" Color="Red"/>
9 </phone:PhoneApplicationPage.Resources >
10
11 <[... plein de choses dans la page ...]>
12 </phone:PhoneApplicationPage >
Ici, jai cr un objet SolidColorBrush - http://msdn.microsoft.com/fr-fr/library/
system.windows.media.solidcolorbrush(v=vs.95).aspx, qui sert peindre une zone
dune couleur unie, dont la couleur est Rouge dans les ressources de ma page. Il est
obligatoire quune ressource possde un nom, ici je lai nomm BrushRouge. Je vais
dsormais pouvoir utiliser cet objet avec des contrles, ce qui donne :
1 <StackPanel >
2 <TextBlock Text="Bonjour ma ressource" Foreground="{
StaticResource BrushRouge}" />
80
LES RESSOURCES
3 <Button Content="Cliquez -moi , je suis rouge" Foreground="{
StaticResource BrushRouge}" />
4 </StackPanel >
Et nous aurons la gure 7.3.
Figure 7.3 Utilisation dune ressource de type pinceau rouge
Alors, quy-a-t-il derrire ces ressources ?
La premire chose que lon peut voir cest la syntaxe particulire lintrieur de la
proprit ForeGround :
1 Foreground="{StaticResource BrushRouge}"
Des accolades avec le mot-cl StaticResource. . . Cela signie qu lexcution de lap-
plication, le moteur va aller chercher la ressource associe au nom BrushRouge et il va
la mettre dans la proprit Foreground de notre contrle.
On appelle la syntaxe entre accolades une extension de balisage XAML ,
en anglais : extension markup.
Ce moteur commence par chercher la ressource dans les ressources de la page et sil ne
la trouve pas, il ira chercher dans le dictionnaire de ressources de lapplication. Nous
avons positionn notre ressource dans la page, cest donc celle-ci quil utilise en premier.
81
CHAPITRE 7. AJOUTER DU STYLE
Remarquez que le dictionnaire de ressources, cest simplement une collection dobjets
associs un nom. Sil est dni dans la page, alors il sera accessible pour tous les
contrles de la page. Sil est dni au niveau de lapplication, alors il sera utilisable
partout dans lapplication. Vous aurez pu constater quici, notre principal intrt duti-
liser une ressource est de pouvoir changer la couleur de tous les contrles en une seule
fois.
Nous pouvons mettre nimporte quel objet dans les ressources. Nous y avons mis un
SolidColorBrush an que cela se voit, mais il est possible dy mettre un peu tout et
nimporte quoi. Pour illustrer ce point, nous allons utiliser le dictionnaire de ressource
de lapplication et y stocker une chane de caractre. Ouvrez donc le chier App.xaml o
se trouve le dictionnaire de ressources. Nous pouvons ajouter notre chane de caractres
dans la section <Application.Resources> dj existante pour avoir :
1 <Application.Resources >
2 <system:String x:Key="TitreApplication">Hello World </ system
:String >
3 </Application.Resources >
Dans le projet cr par dfaut pour Windows Phone 8, il y a dj une
ligne dans les ressources de lapplication : <local:LocalizedStrings
xmlns:local="clr-namespace:HelloWorld"
x:Key="LocalizedStrings"/> qui fait globalement la mme chose, sauf
que lobjet mis en ressource est une instance de la classe LocalizedStrings
qui se trouve la racine du projet.
Vous serez obligs de rajouter lespace de nom suivant en haut du chier App.xaml :
1 xmlns:system="clr -namespace:System;assembly=mscorlib"
dans les proprits de lapplication de manire avoir :
1 <Application
2 x:Class="HelloWorld.App"
3 xmlns="http :// schemas.microsoft.com/winfx/2006/xaml/
presentation"
4 xmlns:x="http :// schemas.microsoft.com/winfx/2006/xaml"
5 xmlns:phone="clr -namespace:Microsoft.Phone.Controls;
assembly=Microsoft.Phone"
6 xmlns:shell="clr -namespace:Microsoft.Phone.Shell;assembly=
Microsoft.Phone"
7 xmlns:system="clr -namespace:System;assembly=mscorlib">
Pourquoi ? Parce que la classe String nest pas connue de lapplication. Il faut lui
indiquer o elle se trouve, en indiquant son espace de nom, un peu comme un using
C#. Pour cela on utilise la syntaxe prcdente pour dire que lespace de nom que jai
nomm system correspondra lespace de nom System de lassembly mscorlib.
Pour utiliser ma classe String, il faudra que je la prxe de system : .
82
LES RESSOURCES
Bref, revenons notre ressource de type String. Je vais pouvoir lutiliser depuis nim-
porte quelle page vu quelle est dnie dans le dictionnaire de ressources de lapplica-
tion, par exemple dans ma page principale :
1 <TextBlock Text="{StaticResource TitreApplication}" Foreground=
"{StaticResource BrushRouge}" />
Et nous aurons donc la gure 7.4.
Figure 7.4 Utilisation dune ressource de type chane de caractre
Le chier App.xaml est lapplication ce que le chier Mainpage.xaml
est la page MainPage. Il est accompagn de son code behind
App.xaml.cs et on peut voir que la classe App drive de la classe Applica-
tion - http://msdn.microsoft.com/fr-fr/library/system.windows.
application(v=vs.95).aspx. Nous y reviendrons mais cest dans cette
classe que nous pourrons grer tout ce qui rapporte lapplication. Cest le
cas par exemple du dictionnaire de ressources, mais cest galement l que
nous pourrons grer les erreurs applicatives non interceptes dans le code et
plein dautres choses que nous dcouvrirons au fur et mesure.
83
CHAPITRE 7. AJOUTER DU STYLE
Les styles
Le style correspond lidentication de plusieurs proprits par un nom, que lon peut
appliquer facilement plusieurs contrles. Un style trouve donc tout fait naturelle-
ment sa place dans les dictionnaires de ressources que nous avons dj vus. Un style
est, comme une ressource, caractris par un nom et cible un type de contrle. Par
exemple, observons le style suivant :
1 <phone:PhoneApplicationPage.Resources >
2 <Style x:Key="StyleTexte" TargetType="TextBlock">
3 <Setter Property="Foreground" Value="Green" />
4 <Setter Property="FontSize" Value="35" />
5 <Setter Property="FontFamily" Value="Comic Sans MS" />
6 <Setter Property="Margin" Value="0 20 0 20" />
7 <Setter Property="HorizontalAlignment" Value="Center"
/>
8 </Style >
9 </phone:PhoneApplicationPage.Resources >
On remarque llment important TargetType="TextBlock" qui me permet dindiquer
que le style sapplique aux contrles TextBlock. La lecture du style nous renseigne sur
ce quil fait. Nous pouvons remarquer que la proprit Foreground aura la valeur Green,
que la proprit FontSize aura la valeur 35, etc. Pour que notre contrle bncie de
ce style, nous pourrons utiliser encore la syntaxe suivante :
1 <TextBlock Text="{StaticResource TitreApplication}" Style="{
StaticResource StyleTexte}"/>
Ce qui nous donnera la gure 7.5.
Ah, mais a me rappelle quelque chose, on na pas dj vu des styles ? Et si, lorsque
nous crons une nouvelle application, Visual Studio nous cr le squelette dune page
dans le chier MainPage.xaml et nous avons notamment le titre de la page dni de
cette faon :
1 <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12 ,17,0,28
">
2 <TextBlock Text="MON APPLICATION" Style="{StaticResource
PhoneTextNormalStyle}" Margin="12 ,0"/>
3 <TextBlock Text="Hello World" Margin="9,-7,0,0" Style="{
StaticResource PhoneTextTitle1Style}"/>
4 </StackPanel >
Vous pouvez dsormais comprendre que ces deux TextBlock utilisent les styles
PhoneTextNormalStyle et PhoneTextTitle1Style. Ce ne sont pas des styles que nous
avons crs. Il sagit de styles systmes, prsents directement dans le systme dexploi-
tation et que nous pouvons utiliser comme bon nous semble.
Le style est un lment qui sera trs souvent utilis dans nos applications. Dnir le
XAML associ ces styles est un peu rbarbatif. Heureusement, Blend peut nous aider
dans la cration de style. . . Prenons par exemple le code XAML suivant :
84
LES STYLES
Figure 7.5 Le style appliqu au TextBlock
1 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12 ,0,12,0">
2 <Grid.ColumnDefinitions >
3 <ColumnDefinition Width="*"/>
4 <ColumnDefinition Width="*"/>
5 </Grid.ColumnDefinitions >
6 <Grid.RowDefinitions >
7 <RowDefinition Height="auto"/>
8 <RowDefinition Height="auto"/>
9 <RowDefinition Height="auto"/>
10 </Grid.RowDefinitions >
11 <TextBlock Text="Nom" Grid.Column="0" Grid.Row="0" />
12 <TextBox Grid.Row="0" Grid.Column="1" />
13 <TextBlock Text="Prnom" Grid.Column="0" Grid.Row="1" />
14 <TextBox Grid.Row="1" Grid.Column="1" />
15 <TextBlock Text="Age" Grid.Column="0" Grid.Row="2" />
16 <TextBox Grid.Row="2" Grid.Column="1" />
17 </Grid >
Qui donne la gure 7.6.
Si nous passons dans Blend, nous pouvons facilement crer un style en faisant un clic
droit sur un TextBlock et en choisissant de modier le style, puis de crer un nouveau
style en choisissant de crer un lment vide (voir la gure 7.7).
85
CHAPITRE 7. AJOUTER DU STYLE
Figure 7.6 Aperu dun formulaire construit en XAML
Figure 7.7 Modication du style dans Blend
86
LES STYLES
Blend nous ouvre une nouvelle fentre o nous pouvons crer un nouveau style (voir
la gure 7.8).
Figure 7.8 Fentre de cration dun nouveau style
Nous devons fournir un nom au style puis nous pouvons indiquer quelle est la porte
du style, soit toute lapplication (ce que jai choisi), soit la page courante, soit un
dictionnaire de ressources dj existant.
Le style est cr dans le chier App.xaml, comme nous lavons dj vu, qui est le chier
de lancement de lapplication. Je peux aller modier les proprits du style, par exemple
la couleur (voir la gure 7.9).
Figure 7.9 Modication de la couleur du style
Une fois le style termin, je peux retourner dans ma page pour appliquer ce style aux
autres contrles. Pour cela, jutilise le bouton droit sur le contrle, Modifier le style
, Appliquer la ressource, et je peux retrouver mon style tout en haut (voir la gure
7.10).
Figure 7.10 Notre nouveau style fait partie de la liste des styles
On remarque au passage quil existe plein de styles dj tout prts, ce sont des styles
systmes comme ceux que nous avons vu un peu plus haut et dont nous pouvons
87
CHAPITRE 7. AJOUTER DU STYLE
allgrement nous servir ! De retour dans le XAML, je peux constater quune proprit
a t rajoute mes TextBlock :
1 <TextBlock Text="Prnom" Grid.Column="0" Grid.Row="1" Style="{
StaticResource TexteStyle}" />
Cest la proprit Style bien videmment, qui va permettre dindiquer que lon applique
le style TexteStyle. Celui-ci est dni dans le XAML du chier App.xaml :
1 <Style x:Key="TexteStyle" TargetType="TextBlock">
2 <Setter Property="Foreground" Value="#FF0B5EF0"/>
3 <Setter Property="FontFamily" Value="Andy"/>
4 <Setter Property="FontSize" Value="32"/>
5 </Style >
Ce qui correspond aux valeurs que jai modies. Et voil, plutt simple non? Remar-
quons avant de terminer que les styles peuvent hriter entre eux, ce qui permet de
complter ou de remplacer certaines valeurs. Prenons par exemple le XAML suivant :
1 <Style x:Key="TexteStyle" TargetType="TextBlock">
2 <Setter Property="Foreground" Value="#FF0B5EF0"/>
3 <Setter Property="FontFamily" Value="Andy"/>
4 <Setter Property="FontSize" Value="32"/>
5 </Style >
6 <Style x:Key="TexteStyle2" TargetType="TextBlock" BasedOn="{
StaticResource TexteStyle}">
7 <Setter Property="FontSize" Value="45"/>
8 <Setter Property="HorizontalAlignment" Value="Center" />
9 </Style >
Le deuxime style hrite du premier grce la proprit BaseOn. Notez que les styles
sont encore plus puissants que a, nous aurons loccasion de voir dautres utilisations
plus loin dans le cours.
Les thmes
Si vous avez jou avec lmulateur ou avec vos Windows Phone, vous avez pu vous rendre
compte que Windows Phone disposait de plusieurs thmes. Ouvrez votre mulateur et
faites glisser lcran sur la droite ou cliquez sur la che en bas de lcran daccueil,
cliquez ensuite sur Paramtres (voir la gure 7.11).
Puis sur thme (voir la gure 7.12).
On obtient cet cran (voir la gure 7.13).
Il est possible de choisir le thme, soit sombre soit clair puis la couleur daccentuation
(voir la gure 7.14).
Quest-ce que a veut dire ? Eh bien cela veut dire quon ne peut pas faire nimporte
quoi avec les couleurs et surtout pas nimporte comment. Par exemple, si jcris du
88
LES THMES
Figure 7.11 Accs au menu de paramtrage de lmulateur
Figure 7.12 Accs au paramtrage des thmes
89
CHAPITRE 7. AJOUTER DU STYLE
Figure 7.13 Paramtrage des thmes
Figure 7.14 Modication de la couleur daccentuation
90
LES THMES
texte de couleur blanche, cela passera trs bien avec mon thme sombre, mais cela
deviendra invisible avec un thme clair.
Les contrles de Windows Phone savent grer ces dirents thmes sans aucun pro-
blme grce aux styles systmes qui savent sadapter aux dirents thmes, comme
par exemple les styles PhoneTextNormalStyle et PhoneTextTitle1Style. Ainsi, si
vous lancez votre application frachement cre en mode sombre, vous aurez les titres
suivants (voir la gure 7.15).
Figure 7.15 Le titre est blanc sur fond noir en mode sombre
Alors quen mode clair, vous aurez la gure 7.16.
Les couleurs sont direntes, cest le style qui gre les dirents thmes. Il est possible de
dtecter le thme de lapplication an dadapter nos designs, par exemple en changeant
une image ou en changeant une couleur, etc. Pour ce faire, on peut utiliser la technique
suivante :
1 Visibility darkBackgroundVisibility = (Visibility)Application.
Current.Resources["PhoneDarkThemeVisibility"];
2 if (darkBackgroundVisibility == Visibility.Visible)
3 {
4 // le thme est sombre
5 }
6 else
7 {
8 // le thme est clair
9 }
91
CHAPITRE 7. AJOUTER DU STYLE
Figure 7.16 Le titre est noir sur fond blanc en mode clair
De mme, on peut rcuprer la couleur daccentuation choisie an de lutiliser sur nos
pages, par exemple :
1 Color couleur = (Color)Application.Current.Resources["
PhoneAccentColor"];
2 MonTextBox.Foreground = new SolidColorBrush(couleur);
Changer lapparence de son contrle
Il ny a pas que les styles qui permettent de changer lapparence dun contrle. Rappelez-
vous, nous avons dit que certains contrles drivaient de la classe ContentControl. Il
sagit de contrles qui contiennent dautres objets. Cest le cas du bouton par exemple.
Il est possible de modier son apparence sans changer ses fonctionnalits. Cest une
des grandes forces du XAML. Il sut de rednir la proprit Content du bouton. . .
Jusqu prsent, un bouton ctait ce XAML ( lintrieur dun StackPanel) :
1 <Button Content="Cliquez -moi !" />
Qui donnait la gure 7.17.
Nous avons mis une chane de caractres dans la proprit Content. Cette proprit
est de type object, il est donc possible dy mettre nimporte quoi. En loccurrence, on
peut y mettre un TextBlock qui donnera le mme rsultat visuel :
92
CHANGER LAPPARENCE DE SON CONTRLE
Figure 7.17 Un simple bouton
1 <Button >
2 <Button.Content >
3 <TextBlock Text="Cliquez -moi" />
4 </Button.Content >
5 </Button >
Si on peut mettre un TextBlock, on peut mettre nimporte quoi et cest a qui est
formidable. Par exemple, on peut facilement mettre une image. Reprenons notre rond
rouge du dbut du chapitre, puis utilisez le XAML suivant :
1 <Button >
2 <Button.Content >
3 <StackPanel >
4 <Image Source="/Assets/Images/rond.png" Width="100"
Height="100" />
5 <TextBlock Text="Cliquez -moi !" />
6 </StackPanel >
7 </Button.Content >
8 </Button >
Nous obtenons un bouton tout fait fonctionnel possdant une image et un texte (voir
la gure 7.18).
Nous navons rien eu dautre faire que de modier lobjet Content et ce bouton
continue se comporter comme un bouton classique. Remarquons avant de terminer
quil est possible de pousser la personnalisation encore plus loin grce aux modles (en
anglais template) que nous verrons plus loin.
En rsum
Les styles sont un lment trs puissant nous permettant de modier lapparence
de nos contrles.
On peut changer lapparence des contrles de type ContentControl pour crer
un autre look tout en conservant la fonctionnalit du contrle.
Il faut faire attention aux dirents thmes dune application et toujours vrier
93
CHAPITRE 7. AJOUTER DU STYLE
Figure 7.18 Un bouton avec une image
que ce quon souhaite acher soit bien visible en fonction des thmes et de la
couleur daccentuation.
94
Chapitre 8
TP1 : Cration du jeu du plus ou du
moins
Dicult :
Bienvenue dans ce premier TP! Vous avez pu dcouvrir dans les chapitres prcdents les
premires bases du XAML permettant la construction dapplications Windows Phone. Il est
grand temps de mettre en pratique ce que nous avons appris. Cest ici loccasion pour vous
de tester vos connaissances et de valider ce que vous appris en ralisant cet exercice.
Pour loccasion, nous allons raliser un petit jeu, le classique jeu du plus ou du moins.
95
CHAPITRE 8. TP1 : CRATION DU JEU DU PLUS OU DU MOINS
Instructions pour raliser le TP
Voici donc un petit TP sous forme de cration dun jeu simple qui va vous permettre
de vous entraner. Lide est de raliser le jeu classique du plus ou du moins. . . Je vous
rappelle les rgles. Lordinateur calcule un nombre alatoire et nous devons le deviner.
chaque saisie, il nous indique si le nombre saisi est plus grand ou plus petit que le
nombre trouver, ainsi que le nombre de coups. Une fois trouv, il nous indique que
nous avons gagn.
Nous allons donc pouvoir utiliser nos connaissances en XAML pour crer une interface
graphique permettant de raliser ce jeu. Nous aurons bien sr besoin dun TextBox
pour obtenir la saisie de lutilisateur. Vous pouvez ensuite utiliser un TextBlock pour
donner les instructions, qui pourront tre de la couleur daccentuation. De mme, vous
utiliserez un autre TextBlock pour acher le nombre de coups. Vous pourrez utiliser
un bouton an de vrier le rsultat et un autre bouton pour recommencer une partie.
Pour rappel, vous pouvez obtenir un nombre alatoire en instanciant un objet Random
et en appelant la mthode Next :
1 Random random = new Random ();
2 int valeurSecrete = random.Next(1, 500);
Vous pouvez choisir les bornes que vous voulez, mais de 1 500 me parat pas trop mal.
Noubliez pas de grer le cas o lutilisateur saisit nimporte quoi. Nous ne voudrions
pas que notre premier jeu sur Windows Phone ait un bug qui fasse planter lapplication!
Cest vous de jouer. Bon courage.
Correction
Alors, comment tait ce TP? Pas trop dicile, non?
Alors, voyons ma correction. Il y a plusieurs faons de raliser ce TP ainsi quune
innit de mise en page possible. Jai choisi un look trs simple, mais nhsitez pas
faire parler votre crativit.
Commenons par le XAML :
1 <Grid x:Name="LayoutRoot" Background="Transparent">
2 <Grid.RowDefinitions >
3 <RowDefinition Height="Auto"/>
4 <RowDefinition Height="*"/>
5 <RowDefinition Height="Auto"/>
6 </Grid.RowDefinitions >
7
8 <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12 ,17,
0,28">
9 <TextBlock x:Name="ApplicationTitle" Text="TP du jeu du
plus ou du moins" Style="{StaticResource
PhoneTextTitle2Style}"/>
10 </StackPanel >
96
CORRECTION
11
12 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12 ,0,12,0"
>
13 <StackPanel >
14 <TextBlock Text="Veuillez saisir une valeur (entre
0 et 500)" Style="{StaticResource
PhoneTextNormalStyle}" HorizontalAlignment="
Center" />
15 <TextBox x:Name="Valeur" InputScope="Number" />
16 <Button Content="Vrifier" Tap="Button_Tap_1" />
17 <TextBlock x:Name="Indications" Height="50"
TextWrapping="Wrap" />
18 <TextBlock x:Name="NombreDeCoups" Height="50"
TextWrapping="Wrap" Style="{StaticResource
PhoneTextNormalStyle}" />
19 </StackPanel >
20 </Grid >
21 <Button Content="Rejouer" Tap="Button_Tap_2" Grid.Row="2"
/>
22 </Grid >
Il sagit de disposer mes contrles de manire obtenir ce rendu (voir la gure 8.1).
Figure 8.1 Rendu du TP du jeu du plus ou du moins dans lmulateur
Ce quil est important de voir ici cest que tous mes TextBlock possdent un style
qui sait grer les thmes, sauf celui pour les indications car cest par code que je
97
CHAPITRE 8. TP1 : CRATION DU JEU DU PLUS OU DU MOINS
vais positionner la couleur. Remarquez galement que le TextBox achera un clavier
numrique grce lInputScope qui vaut Number.
Passons prsent au code behind :
1 public partial class MainPage : PhoneApplicationPage
2 {
3 private Random random;
4 private int valeurSecrete;
5 private int nbCoups;
6
7 public MainPage ()
8 {
9 InitializeComponent ();
10
11 random = new Random ();
12 valeurSecrete = random.Next(1, 500);
13 nbCoups = 0;
14 Color couleur = (Color)Application.Current.Resources["
PhoneAccentColor"];
15 Indications.Foreground = new SolidColorBrush(couleur);
16 }
17
18 private void Button_Tap_1(object sender , System.Windows.
Input.GestureEventArgs e)
19 {
20 int num;
21 if (int.TryParse(Valeur.Text , out num))
22 {
23 if (valeurSecrete == num)
24 {
25 Indications.Text = "Gagn !!";
26 }
27 else
28 {
29 nbCoups ++;
30 if (valeurSecrete < num)
31 Indications.Text = "Trop grand ...";
32 else
33 Indications.Text = "Trop petit ...";
34 if (nbCoups == 1)
35 NombreDeCoups.Text = nbCoups + " coup";
36 else
37 NombreDeCoups.Text = nbCoups + " coups";
38 }
39 }
40 else
41 Indications.Text = "Veuillez saisir un entier ...";
42 }
43
44 private void Button_Tap_2(object sender , System.Windows.
98
CORRECTION
Input.GestureEventArgs e)
45 {
46 valeurSecrete = random.Next(1, 500);
47 nbCoups = 0;
48 Indications.Text = string.Empty;
49 NombreDeCoups.Text = string.Empty;
50 Valeur.Text = string.Empty;
51 }
52 }
La classe Color et la classe SolidColorBrush ncessitent limport suivant :
1 using System.Windows.Media;
Le jeu en lui-mme ne devrait pas avoir pos trop de problmes. Lalgorithme est
classique, on commence par dterminer un nombre alatoire puis chaque demande
de vrication, on transforme la valeur saisie en entier, an de vrier que lutilisateur
na pas saisi nimporte quoi. Avec le clavier numrique, les erreurs sont limites, mais
elles sont encore possible car on demande des entiers et lutilisateur a la possibilit de
saisir des nombres virgule. Puis on compare et on indique le rsultat (voir la gure
8.2).
Figure 8.2 Une partie en cours de jeu . . .
Et voil pour notre premier TP. Vous avez pu voir comme il est nalement assez simple
de crer des petits programmes sur nos tlphones grce au XAML et au C#.
99
CHAPITRE 8. TP1 : CRATION DU JEU DU PLUS OU DU MOINS
100
Chapitre 9
Dessiner avec le XAML
Dicult :
En plus des contrles, le XAML possde les formes (en anglais Shape). Elles permettent
de dessiner direntes formes sur nos pages. Voyons prsent comment cela fonctionne.
101
CHAPITRE 9. DESSINER AVEC LE XAML
Dessin 2D
Il existe plusieurs types de formes. Elles sont reprsentes par des classes qui d-
rivent toutes dune classe abstraite de base : Shape - http://msdn.microsoft.com/
fr-fr/library/system.windows.shapes.shape(v=vs.95).aspx. Shape est un l-
ment achable sur une page dans la mesure o elle drive, comme les contrles, de
FrameworkElement et de UIElement. Nous avons notre disposition :
Les ellipses et cercles via la classe Ellipse - http://msdn.microsoft.com/fr-fr/
library/system.windows.shapes.ellipse(v=vs.95).aspx
Les lignes, via la classe Line - http://msdn.microsoft.com/fr-fr/library/
system.windows.shapes.line(v=vs.95).aspx
Plusieurs lignes ou courbes connectes, via la classe Path - http:
//msdn.microsoft.com/fr-fr/library/system.windows.shapes.path(v=
vs.95).aspx. Path pouvant tre traduit en trac, il sagit dun trac de lignes
ou de courbes.
Des lignes connectes via la classe PolyLine - http://msdn.microsoft.com/
fr-fr/library/system.windows.shapes.polyline(v=vs.95).aspx
Les polygones, via la classe Polygon - http://msdn.microsoft.com/fr-fr/
library/system.windows.shapes.polygon(v=vs.95).aspx. La dirence avec
le PolyLine est que la forme se termine en reliant le dernier trait au premier.
Des rectangles via la classe Rectangle - http://msdn.microsoft.com/fr-fr/
library/system.windows.shapes.rectangle(v=vs.95).aspx
Si vous vous rappelez, nous avons utilis la classe Rectangle dans un prcdent chapitre
pour illustrer les marges. Dessinons par exemple un carr et un cercle. Pour cela, je
peux utiliser les classes Rectangle et Ellipse :
1 <StackPanel >
2 <Rectangle Width="100" Height="100" Fill="Aqua" />
3 <Ellipse Height="100" Width="100" Fill="Azure" />
4 </StackPanel >
Ce qui nous donne la gure 9.1.
Remarquons que la proprit Fill permet de colorer les formes. Nous allons y revenir.
Mais le plus simple est encore dutiliser Blend pour ce genre de choses. Vous avez accs
aux formes soit dans longlet des composants, soit en cliquant sur le rectangle (voir la
gure 9.2).
Blend est votre meilleur alli pour dessiner sur vos pages. Noubliez pas quil est capable
dexploiter le XAML que vous avez saisi la main dans Visual Studio, par exemple :
1 <Canvas >
2 <Line X1="10" Y1="100" X2="150" Y2="100" Stroke="Blue"
StrokeThickness="15"/>
3 </Canvas >
qui va nous permettre de tracer une ligne bleue horizontale dpaisseur 15. Nous la
voyons apparatre dans Blend (voir la gure 9.3).
102
DESSIN 2D
Figure 9.1 Achage dun rectangle et dune ellipse grce leurs contrles respectifs
Figure 9.2 Accs aux formes depuis Blend
103
CHAPITRE 9. DESSINER AVEC LE XAML
Figure 9.3 Achage dune ligne bleue dans Blend
Je vais marrter l pour les exemples de formes car la documentation en ligne possde
des exemples qui sont plutt simples comprendre. Vous allez dailleurs voir dans le
prochain chapitre un exemple de polygone.
Pinceaux
Les pinceaux vont nous permettre de colorier nos formes. Nous avons rapidement vu
tout lheure que nous pouvions colorier nos formes grce la proprit Fill. Par
exemple, le XAML suivant :
1 <Canvas >
2 <Polygon Points="50 ,50 200 , 200 50,200" Fill="Aqua" Stroke=
"Blue" StrokeThickness="5" />
3 </Canvas >
dessine un triangle rectangle de couleur Aqua dont le trait est bleu, dpaisseur 5 (voir
la gure 9.4).
En fait, Aqua et Blue sont des objets drivs de la classe Brush, en loccurrence
ici il sagit dune SolidColorBrush - http://msdn.microsoft.com/fr-fr/library/
system.windows.media.solidcolorbrush(v=vs.95).aspx. Comme on la dj vu,
on peut donc crire notre prcdent pinceau de cette faon :
104
PINCEAUX
Figure 9.4 Le triangle est color grce au pinceau Aqua
1 <Polygon Points="50,50 200 , 200 50,200" Stroke="Blue"
StrokeThickness="5">
2 <Polygon.Fill >
3 <SolidColorBrush Color="Aqua" />
4 </Polygon.Fill >
5 </Polygon >
Ce qui nous ore un meilleur contrle sur le pinceau. Nous pouvons par exemple changer
lopacit et la passer de 1 (valeur par dfaut) 0.4 par exemple :
1 <Polygon Points="50,50 200 , 200 50,200" Stroke="Blue"
StrokeThickness="5">
2 <Polygon.Fill >
3 <SolidColorBrush Color="Aqua" Opacity="0.4" />
4 </Polygon.Fill >
5 </Polygon >
Et nous pouvons voir que la couleur est un peu plus transparente (voir la gure 9.5).
Figure 9.5 Lopacit joue sur la transparence du contrle
Toutes les proprits commenant par Stroke se rapportent au trait
de la forme. Par exemple, Stroke permet de modier la couleur du
trait, StrokeThickness permet de modier lpaisseur du trait ou encore
StrokeDash que nous navons pas vu qui permet de modier lapparence
dun trait (pointills, ches aux extrmits, . . .).
105
CHAPITRE 9. DESSINER AVEC LE XAML
Vous vous en doutez, il existe dautres pinceaux que le pinceau uni. Nous avons gale-
ment notre disposition :
Un gradient linaire, via la classe LinearGradientBrush - http:
//msdn.microsoft.com/fr-fr/library/system.windows.media.
lineargradientbrush(v=vs.95).aspx
Un gradient radial, via la classe RadialGradientBrush - http://msdn.microsoft.
com/fr-fr/library/system.windows.media.radialgradientbrush(v=vs.95)
.aspx
Une image, via la classe ImageBrush - http://msdn.microsoft.com/fr-fr/
library/system.windows.media.imagebrush(v=vs.95).aspx
Une vido, via la classe VideoBrush - http://msdn.microsoft.com/fr-fr/
library/system.windows.media.videobrush(v=vs.95).aspx
Utilisons par exemple une ImageBrush pour acher la mascotte dOpenClassrooms
dans notre triangle (voir la gure 9.6).
Figure 9.6 Zozor, la mascotte
Nous aurons le XAML suivant :
1 <Polygon Points="50 ,50 200 , 200 50,200" Stroke="Blue"
StrokeThickness="5">
2 <Polygon.Fill >
3 <ImageBrush ImageSource="http :// uploads.siteduzero.com/
files/337001_338000/337519.png" />
4 </Polygon.Fill >
5 </Polygon >
Qui donnera la gure 9.7.
Figure 9.7 Le triangle avec un pinceau utilisant limage de Zozor
Et voil comment utiliser une image comme pinceau. Sauf que ce triangle rectangle ne
lui rend vraiment pas honneur . . . ! Pour faire un dgrad, le mieux est dutiliser Blend.
106
PINCEAUX
Reprenons notre triangle rectangle et cliquez droite sur le pinceau de dgrad (voir
la gure 9.8).
Figure 9.8 Cration dun pinceau de dgrad
Il ne reste plus qu choisir les couleurs de votre dgrad. Il faut vous servir de la bande
en bas pour dnir les direntes couleurs du dgrad (voir la gure 9.9).
Figure 9.9 Choix du dgrad
Et nous aurons un mgnique triangle dgrad (voir la gure 9.10) !
Figure 9.10 Le triangle avec le pinceau dgrad
Notons que le XAML gnr est le suivant :
107
CHAPITRE 9. DESSINER AVEC LE XAML
1 <Polygon Points="50 ,50 200 , 200 50,200" Stroke="Blue"
StrokeThickness="5">
2 <Polygon.Fill >
3 <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0
">
4 <GradientStop Color="Black" Offset="0"/>
5 <GradientStop Color="#FF1FDC0C" Offset="1"/>
6 <GradientStop Color="#FFE8AD11" Offset="0.488"/>
7 </LinearGradientBrush >
8 </Polygon.Fill >
9 </Polygon >
Voil pour ce petit tour des pinceaux.
Les transformations
Le XAML possde un systme de transformations qui permet dagir sur les contrles. Il
existe plusieurs types de transformations dites anes car elles conservent la structure
originale du contrle. Il est par exemple possible deectuer :
une rotation grce la classe RotateTransform - http://msdn.microsoft.com/
fr-fr/library/system.windows.media.rotatetransform(v=vs.95).aspx
une translation grce la classe TranslateTransform - http://msdn.microsoft.
com/fr-fr/library/system.windows.media.translatetransform(v=vs.95)
.aspx
une mise lchelle grce la classe ScaleTransform - http://msdn.microsoft.
com/fr-fr/library/system.windows.media.scaletransform(v=vs.95).aspx
une inclinaison grce la classe SkewTransform - http://msdn.microsoft.
com/fr-fr/library/system.windows.media.skewtransform(v=vs.95).aspx
Une transformation matricielle grce la classe MatrixTransform -
http://msdn.microsoft.com/fr-fr/library/system.windows.media.
matrixtransform(v=vs.95).aspx
Par exemple, pour faire pivoter un bouton de 45, je peux utiliser le code suivant :
1 <Grid x:Name="LayoutRoot" Background="Transparent">
2 <StackPanel >
3 <Button Content="Cliquez -moi !">
4 <Button.RenderTransform >
5 <RotateTransform x:Name="Rotation" Angle="45"
CenterX="100" CenterY="50" />
6 </Button.RenderTransform >
7 </Button >
8 </StackPanel >
9 </Grid >
Ce qui nous donne la gure 9.11.
Il sut de renseigner la proprit RenderTransform du contrle, sachant que cette
proprit fait partie de la classe UIElement qui est la classe mre de tous les contrles
108
LES TRANSFORMATIONS
Figure 9.11 Rotation dun contrle de 45
achables. Dans cette proprit, on met la classe RotateTransform en lui prcisant no-
tamment langle de rotation et les coordonnes du centre de rotation. Illustrons encore
une transformation grce la classe ScaleTransform pour eectuer un grossissement
dun TextBlock :
1 <TextBlock Text="Hello world" />
2 <TextBlock Text="Hello world">
3 <TextBlock.RenderTransform >
4 <ScaleTransform ScaleX="3" ScaleY="10" />
5 </TextBlock.RenderTransform >
6 </TextBlock >
Qui donne la gure 9.12.
Ces transformations peuvent se combiner grce la classe TransformGroup, par exemple
ici je combine une rotation avec une translation :
1 <TextBlock Text="Hello world">
2 <TextBlock.RenderTransform >
3 <TransformGroup >
4 <RotateTransform Angle="90" />
5 <TranslateTransform X="150" Y="100" />
6 </TransformGroup >
7 </TextBlock.RenderTransform >
8 </TextBlock >
109
CHAPITRE 9. DESSINER AVEC LE XAML
Figure 9.12 Mise lchelle du contrle
Et nous aurons la gure 9.13.
Sachant quil est possible de faire la mme chose avec une transformation compo-
site, grce la classe CompositeTransform - http://msdn.microsoft.com/fr-fr/
library/system.windows.media.compositetransform(v=vs.95).aspx. Elle sutilise
ainsi :
1 <TextBlock Text="Hello world">
2 <TextBlock.RenderTransform >
3 <CompositeTransform TranslateX="150" TranslateY="100"
Rotation="90" />
4 </TextBlock.RenderTransform >
5 </TextBlock >
Voil pour les transformations. En soi elles ne sont pas toujours trs utiles, mais elles
rvlent toutes leurs puissances grce aux animations que nous dcouvrirons dans le
chapitre suivant.
En rsum
Le XAML possde plein de formes que nous pouvons utiliser pour dessiner dans
nos applications, comme le trait, lellipse, le rectangle, etc.
chaque forme peut tre applique une couleur de remplissage ou de traits
grce aux pinceaux.
110
LES TRANSFORMATIONS
Figure 9.13 Rotation combine une translation
Il est galement possible de faire subir des transformations un contrle comme
une rotation ou une translation.
111
CHAPITRE 9. DESSINER AVEC LE XAML
112
Chapitre 10
Crer des animations
Dicult :
Des contrles, du dessin . . . nous sommes presque prts raliser des jolies interfaces en
laissant parler notre crativit. Mais tout cela manque un peu de dynamique, de trucs qui
bougent et nous en mettent plein la vue.
Le XAML nous a entendu ! Grce lui, il est trs facile de crer des animations. Elles
vont nous servir mettre en valeur certains lments, ou raliser un eet de transition en
rajoutant du mouvement et de linteractivit. Bref, de quoi innover un peu et embellir vos
applications.
Nous allons dcouvrir dans ce chapitre comment tout cela fonctionne et comment raliser
nos propres animations directement en manipulant le XAML, ou encore grce loutil
professionnel de design : Expression Blend. Soyez prt ce que a bouge.
113
CHAPITRE 10. CRER DES ANIMATIONS
Principes gnraux des animations
Une animation consiste faire varier les proprits dun contrle dans un temps prcis.
Par exemple, si je veux faire bouger un contrle dans un Canvas, je vais pouvoir faire
varier les proprits Canvas.Top et Canvas.Left. De la mme faon, si je veux faire
disparaitre un lment avec ce que lon appelle communment leet fade , je vais
pouvoir faire varier la proprit dopacit dun contrle.
Pour cela, le XAML possde plusieurs classes qui vont nous tre utiles. Des
classes permettant de faire varier une proprit de type couleur, une pro-
prit de type double et une proprit de type Point qui sont respectivement
les classes ColorAnimation - http://msdn.microsoft.com/fr-fr/library/
system.windows.media.animation.coloranimation(v=vs.95).aspx, DoubleA-
nimation - http://msdn.microsoft.com/fr-fr/library/system.windows.
media.animation.doubleanimation(v=vs.95).aspx et PointAnimation -
http://msdn.microsoft.com/fr-fr/library/system.windows.media.animation.
pointanimation(v=vs.95).aspx.
Il nest possible danimer que ces trois types de valeur.
Pour fonctionner, elles ont besoin dune autre classe qui soccupe de contrler les ani-
mations an dindiquer leurs cibles et la planication de lanimation. Il sagit de la
classe StoryBoard - http://msdn.microsoft.com/fr-fr/library/system.windows.
media.animation.storyboard(v=vs.95).aspx dont le nom explicite rappelle un peu
les projets de montage audio ou vido. Cest le mme principe, cest elle qui va cadencer
les direntes animations.
Cration dune animation simple (XAML)
Pour illustrer les animations, je vais vous montrer leet de disparition ( fade ) appli-
qu un contrle. Crons donc un contrle, par exemple un StackPanel contenant un
bouton et un TextBlock. Jai besoin galement dun autre bouton qui va me permettre
de dclencher lanimation :
1 <Grid x:Name="LayoutRoot" Background="Transparent">
2 <Grid.RowDefinitions >
3 <RowDefinition Height="Auto"/>
4 <RowDefinition Height="*"/>
5 </Grid.RowDefinitions >
6 <StackPanel x:Name="LeStackPanel">
7 <Button Content="Cliquez -moi !" />
8 <TextBlock Text="Je vais bientt disparatre ..." />
9 </StackPanel >
10 <StackPanel Grid.Row="1">
114
CRATION DUNE ANIMATION SIMPLE (XAML)
11 <Button Content="Dmarrer l'animation" Tap="Button_Tap"
/>
12 </StackPanel >
13 </Grid >
Nous allons maintenant crer notre Storyboard. Celui-ci doit se trouver en ressources.
Comme on la dj vu, vous pouvez le mettre en ressources de lapplication, de la page
ou bien en ressources dun contrle parent. Mettons-le dans les ressources de la grille :
1 <Grid x:Name="LayoutRoot" Background="Transparent">
2 <Grid.RowDefinitions >
3 <RowDefinition Height="*"/>
4 <RowDefinition Height="*"/>
5 </Grid.RowDefinitions >
6 <Grid.Resources >
7 <Storyboard x:Name="MonStoryBoard">
8 </Storyboard >
9 </Grid.Resources >
10
11 <StackPanel x:Name="LeStackPanel">
12 <Button Content="Cliquez -moi !" />
13 <TextBlock Text="Je vais bientt disparatre ..." />
14 </StackPanel >
15 <StackPanel Grid.Row="1">
16 <Button Content="Dmarrer l'animation" Tap="Button_Tap"
/>
17 </StackPanel >
18 </Grid >
Ce Storyboard doit avoir un nom an dtre manipul par le clic sur le bouton. Il faut
maintenant dnir lanimation :
1 <Storyboard x:Name="MonStoryBoard">
2 <DoubleAnimation From="1.0" To="0.0" Duration="0:0:2"
3 Storyboard.TargetName="LeStackPanel"
4 Storyboard.TargetProperty="Opacity"/>
5 </Storyboard >
Il sagit dune animation de type double o nous allons animer la proprit Opacity
pour la faire aller de la valeur 1 (visible) la valeur 0 (invisible) pendant une dure
de deux secondes, ciblant notre contrle nomm LeStackPanel. Il faut maintenant
dclencher lanimation lors du clic sur le bouton :
1 private void Button_Tap(object sender , System.Windows.Input.
GestureEventArgs e)
2 {
3 MonStoryBoard.Begin ();
4 }
Dicile de vous faire une copie dcran du rsultat mais nhsitez pas essayer par
vous-mme (voir la gure 10.1).
115
CHAPITRE 10. CRER DES ANIMATIONS
Figure 10.1 Lanimation de lopacit fait disparatre le contrle
Il est possible de faire en sorte que lanimation se joue en boucle et de manire indnie.
Il sut de rajouter les proprits AutoReverse et RepeatBehavior. Par exemple, ici je
vais animer un bouton de manire ce quil se dplace de gauche droite et de droite
gauche indniment.
1 <Grid x:Name="LayoutRoot" Background="Transparent">
2 <Grid.RowDefinitions >
3 <RowDefinition Height="*"/>
4 <RowDefinition Height="*"/>
5 </Grid.RowDefinitions >
6 <Grid.Resources >
7 <Storyboard x:Name="MonStoryBoard">
8 <DoubleAnimation From="0" To="200" Duration="0:0:3"
9 AutoReverse="True"
RepeatBehavior="Forever"
10 Storyboard.TargetName="
MonBouton" Storyboard.
TargetProperty="(Canvas.Left
)"/>
11 </Storyboard >
12 </Grid.Resources >
13
14 <Canvas Width="480" Height="500" x:Name="LeCanvas">
15 <Button x:Name="MonBouton" Content="Cliquez -moi !" />
16 </Canvas >
116
CRATION DUNE ANIMATION SIMPLE (XAML)
17 <StackPanel Grid.Row="1">
18 <Button Content="Dmarrer l'animation" Tap="Button_Tap"
/>
19 </StackPanel >
20 </Grid >
Jen prote pour indiquer que pour animer une proprit complexe, il faut la
saisir entre parenthses. Je reviendrai sur ce type de proprit plus loin dans
le cours.
Nous pouvons contrler plus nement une animation. Jusqu prsent, nous avons uti-
lis la mthode Begin() pour dmarrer une animation. Vous pouvez galement utiliser
la mthode Stop() pour arrter une animation, la mthode Pause() pour la mettre
en pause et la mthode Resume() pour la reprendre. Vous pouvez galement faire des
animations de transformations. Il sut de combiner lutilisation des transformations
et dune DoubleAnimation. Par exemple, ici je vais faire tourner mon bouton de 90
degrs et le faire revenir sa position initiale :
1 <Grid x:Name="LayoutRoot" Background="Transparent">
2 <Grid.RowDefinitions >
3 <RowDefinition Height="*"/>
4 <RowDefinition Height="*"/>
5 </Grid.RowDefinitions >
6 <Grid.Resources >
7 <Storyboard x:Name="MonStoryBoard">
8 <DoubleAnimation From="0" To="90" Duration="0:0:1"
AutoReverse="True"
9 Storyboard.TargetName="Rotation"
Storyboard.TargetProperty="Angle
"/>
10 </Storyboard >
11 </Grid.Resources >
12
13 <StackPanel >
14 <Button x:Name="MonBouton" Content="Cliquez -moi !">
15 <Button.RenderTransform >
16 <RotateTransform x:Name="Rotation" Angle="0" />
17 </Button.RenderTransform >
18 </Button >
19 </StackPanel >
20 <StackPanel Grid.Row="1">
21 <Button Content="Dmarrer l'animation" Tap="Button_Tap"
/>
22 </StackPanel >
23 </Grid >
Il sut de cibler la proprit Angle de lobjet RotateTransform. Si vous voulez quune
animation dmarre partir dun certain temps, vous pouvez rajouter la proprit
BeginTime au Storyboard :
117
CHAPITRE 10. CRER DES ANIMATIONS
1 <Storyboard x:Name="MonStoryBoard" BeginTime="0:0:2">
2 <DoubleAnimation From="0" To="90" Duration="0:0:1"
AutoReverse="True"
3 Storyboard.TargetName="Rotation" Storyboard.
TargetProperty="Angle"/>
4 </Storyboard >
Par exemple ici, lanimation va durer une seconde et dmarrera deux secondes aprs son
dclenchement via la mthode Begin(). On peut contrler plus nement une animation
grce aux animations dites Key Frame qui permettent dindiquer dirents moments
cls dune animation. Il est possible ainsi de spcier la valeur de la proprit anime
un moment T. On utilisera les trois types danimations suivantes :
DoubleAnimationUsingKeyFrames
ColorAnimationUsingKeyFrames
PointAnimationUsingKeyFrames
Chacune de ces animations peut tre de trois types : Linear, Discret et Spline.
Lanimation linaire se rapproche des animations que nous avons vues prcdemment
dans la mesure o entre les moments cls, lanimation passera par toutes les valeurs
sparant les deux valeurs des moments cls. On pourrait illustrer ceci en simulant
un secouage de bouton an dattirer lattention de lutilisateur. Le secouage va
consister faire une rotation de X degrs dans le sens horaire, puis revenir la position
initiale, puis faire la rotation de X degrs dans le sens anti horaire et enn revenir la
position initiale. Il y a donc cinq moments cls dans cette animation :
1 <Grid x:Name="LayoutRoot" Background="Transparent">
2 <Grid.RowDefinitions >
3 <RowDefinition Height="*"/>
4 <RowDefinition Height="*"/>
5 </Grid.RowDefinitions >
6 <Grid.Resources >
7 <Storyboard x:Name="MonStoryBoard" >
8 <DoubleAnimationUsingKeyFrames Storyboard.
TargetName="Rotation" Storyboard.TargetProperty=
"Angle" RepeatBehavior="5x">
9 <LinearDoubleKeyFrame Value="0" KeyTime="00:00:
00"/>
10 <LinearDoubleKeyFrame Value="5" KeyTime="00:00:
00.1"/>
11 <LinearDoubleKeyFrame Value="0" KeyTime="00:00:
00.2"/>
12 <LinearDoubleKeyFrame Value="-5" KeyTime="00:00
:00.3"/>
13 <LinearDoubleKeyFrame Value="0" KeyTime="00:00:
00.4"/>
14 </DoubleAnimationUsingKeyFrames >
15 </Storyboard >
16 </Grid.Resources >
17
18 <StackPanel >
118
CRATION DUNE ANIMATION COMPLEXE (BLEND)
19 <Button x:Name="MonBouton" Content="Cliquez -moi !"
Width="200" Height="100">
20 <Button.RenderTransform >
21 <RotateTransform x:Name="Rotation" Angle="0"
CenterX="100" CenterY="50" />
22 </Button.RenderTransform >
23 </Button >
24 </StackPanel >
25 <StackPanel Grid.Row="1">
26 <Button Content="Dmarrer l'animation" Tap="Button_Tap"
/>
27 </StackPanel >
28 </Grid >
tant donn que nous animons un angle, nous utiliserons la classe
DoubleAnimationUsingKeyFrames. Vu que nous voulons des transitions linaires pour
une animation de type double, nous pourrons utiliser la classe LinearDoubleKeyFrame
pour indiquer nos moments cls. Ainsi, jindique quau moment 0, langle sera de 0
degrs. Une fraction de seconde plus tard, langle sera de 5 degrs. Au bout de deux
fractions de seconde, langle sera nouveau 0 degrs. Une fraction de seconde plus
tard, langle sera de -5 degrs et enn, une fraction de seconde plus tard, langle
reviendra sa position initiale.
noter que cette animation sera joue 5 fois grce la proprit RepeatBehavior="5x".
Il y aurait encore beaucoup de choses dire sur ce genre danimations, mais nous allons
prsent dcouvrir comment raliser des animations grce blend.
Cration dune animation complexe (Blend)
Expression Blend, en sa qualit de logiciel de design professionnel facilite la cration
danimations. Nous allons crer une petite animation inutile pour illustrer son fonc-
tionnement. Repartez dune page toute neuve et ouvrez-l dans Expression Blend.
Pour rappel, cliquez-droit sur le chier XAML et choisissez Ouvrir dans expression
blend. Nous allons prsent ajouter un bouton. Slectionnez le bouton dans la boite
outils et faites le glisser sur la surface de la page (voir la gure 10.2).
Allez maintenant dans le menu Fentre et choisissez espace de travail puis animation
an de passer dans la vue ddie lanimation (voir la gure 10.3).
En bas, dans longlet Objets et chronologie, cliquez sur le plus pour crer une nou-
velle animation (voir la gure 10.4).
Donnez un nom votre Storyboard, comme indiqu la gure 10.5.
Il apparat ensuite en bas droite la ligne de temps qui va nous permettre de dnir
des images cls (voir la gure 10.6).
Dplacez le trait jaune qui est sous le chire zro pour le placer sous le chire un, en
le slectionnant par le haut de la ligne. Cela nous permet de dnir une image cl la
premire seconde de lanimation. Nous allons dplacer le bouton vers le bas droite.
119
CHAPITRE 10. CRER DES ANIMATIONS
Figure 10.2 Ajout dun bouton partir de Blend
Figure 10.3 Changement de lespace de travail
Figure 10.4 Cration dune nouvelle animation
120
CRATION DUNE ANIMATION COMPLEXE (BLEND)
Figure 10.5 Nommage du storyboard
Figure 10.6 La ligne de temps du storyboard
Cela signiera que pendant cette seconde, lanimation fera le trajet de la position 0
la position 1 correspondant au dplacement du bouton que nous avons ralis.
Pour voir comment rend lanimation, cliquez sur le petit bouton de lecture en haut de
la ligne de temps (voir la gure 10.7).
Figure 10.7 Dmarrage de lanimation
Je ne peux pas vous illustrer le rsultat, mais vous devriez voir votre rectangle se
dplacer de haut en bas droite. Essayez ! Nhsitez pas rduire le zoom si vous
ne voyez pas tout lcran du designer. Et voil, un dbut danimation plutt simple
faire !
Sauvegardez votre chier et repassez dans Visual Studio. Vous pouvez voir que le chier
121
CHAPITRE 10. CRER DES ANIMATIONS
XAML, aprs rechargement, contient dsormais un code qui ressemble au suivant :
1 <phone:PhoneApplicationPage.Resources >
2 <Storyboard x:Name="MonStoryBoard">
3 <DoubleAnimation Duration="0:0:1" To="166" Storyboard.
TargetProperty="(UIElement.RenderTransform).(
CompositeTransform.TranslateX)" Storyboard.
TargetName="button" d:IsOptimized="True"/>
4 <DoubleAnimation Duration="0:0:1" To="26" Storyboard.
TargetProperty="(UIElement.RenderTransform).(
CompositeTransform.TranslateY)" Storyboard.
TargetName="button" d:IsOptimized="True"/>
5 </Storyboard >
6 </phone:PhoneApplicationPage.Resources >
7
8 <Grid x:Name="LayoutRoot" Background="Transparent">
9 <Grid.RowDefinitions >
10 <RowDefinition Height="Auto"/>
11 <RowDefinition Height="*"/>
12 </Grid.RowDefinitions >
13
14 <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12 ,17,
0,28">
15 <TextBlock Text="MON APPLICATION" Style="{
StaticResource PhoneTextNormalStyle}" Margin="12,0"
/>
16 <TextBlock Text="nom de la page" Margin="9,-7,0,0"
Style="{StaticResource PhoneTextTitle1Style}"/>
17 </StackPanel >
18
19 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12 ,0,12 ,0"
>
20 <Button x:Name="button" Content="Button"
HorizontalAlignment="Left" Margin="137 ,68 ,0,0"
VerticalAlignment="Top" RenderTransformOrigin="0.5,0
.5">
21 <Button.RenderTransform >
22 <CompositeTransform/>
23 </Button.RenderTransform >
24 </Button >
25 </Grid >
26 </Grid >
On peut voir quil nous a mis une CompositeTransform dans le bouton avec une
translation sur laxe des X et sur laxe des Y de une seconde. Remarquez la syntaxe
particulire qua utilis Blend :
1 <DoubleAnimation Duration="0:0:1" To="166" Storyboard.
TargetProperty="(UIElement.RenderTransform).(
CompositeTransform.TranslateX)" Storyboard.TargetName="
button" d:IsOptimized="True"/>
122
CRATION DUNE ANIMATION COMPLEXE (BLEND)
et notamment sur la proprit TargetProperty. Alors que dans mon exemple, javais
donn un nom la transformation pour animer une proprit de cette transforma-
tion, ici Blend a choisi danimer une proprit relative du bouton, nomm button.
Il dit quil va animer la proprit TranslateX de lobjet CompositeTransform fai-
sant partie du RenderTransform correspondant au bouton, sachant que la proprit
RenderTransform fait partie de la classe de base UIElement.
Revenons Expression Blend pour rajouter une rotation. Plaons donc notre ligne
de temps sur la deuxime seconde. Je dplace mon bouton en bas gauche an de
raliser une translation laquelle je vais combiner une rotation. Aller dans la fentre
de proprits du bouton et aller tout en bas pour cliquer sur transformer, et choisir
le deuxime onglet pour faire pivoter (voir la gure 10.8).
Figure 10.8 Rotation dun contrle via Blend
Vous pouvez dsormais choisir un angle, disons 40. Vous pouvez vrier que la trans-
lation se fait en mme temps que la rotation en appuyant sur le bouton de lecture.
Terminons enn notre mini boucle en dplaant la ligne de temps sur la troisime se-
conde et en faisant revenir le bouton la position premire et en rglant langle sur
360. Et voil, nous avons termin. Enn. . . presque. Lanimation est prte mais rien
ne permet de la dclencher. Il existe une solution pour le faire avec Expression Blend,
via les comportements que lon trouve plus souvent sous le terme anglais de Behavior.
Jai choisi de ne pas en parler dans ce cours car cela ncessiterait pas mal dexplications
qui ne nous serviront pas particulirement pour la suite. Nous allons donc retourner
dans Visual Studio pour dmarrer manuellement lanimation, par exemple lors du clic
sur le bouton. Rajoutons donc lvnement clic directement dans notre bouton :
1 <Button x:Name="button" Content="Button" Height="77" Margin="98
,60 ,165 ,0" VerticalAlignment="Top" RenderTransformOrigin="0.
5,0.5" Tap="Button_Tap">
2 <Button.RenderTransform >
3 <CompositeTransform/>
4 </Button.RenderTransform >
5 </Button >
Avec dans le code behind :
123
CHAPITRE 10. CRER DES ANIMATIONS
1 private void Button_Tap(object sender , System.Windows.Input.
GestureEventArgs e)
2 {
3 MonStoryBoard.Begin ();
4 }
Et voil. Notre animation est termine !
Projections 3D
Chaque lment achable avec le XAML peut subir une projection 3D. Cela consiste
donner une surface 2D une perspective 3D an de raliser un eet visuel. Plutt
quun long discours, un petit exemple qui parlera de lui-mme. Prenons par exemple
une image, limage de la couverture de mon livre sur le C# :
1 <Image Source="http :// uploads.siteduzero.com/files/
365001_366000/365350.jpg"/>
Qui donne la gure 10.9.
Figure 10.9 Image de la couverture du livre pour apprendre le C# dans lmulateur
Pour lui faire subir un eet de perspective, nous pouvons utiliser le XAML suivant :
1 <Image Source="http :// uploads.siteduzero.com/files/
365001_366000/365350.jpg">
124
PROJECTIONS 3D
2 <Image.Projection >
3 <PlaneProjection RotationX="-35" RotationY="-35"
RotationZ="15" />
4 </Image.Projection >
5 </Image >
qui lui fera subir une rotation de -35 autour de laxe des X, de -35 autour de laxe
des Y et de 15 autour de laxe des Z, ce qui donnera la gure 10.10.
Figure 10.10 Limage avec une projection 3D
Plutt sympa comme eet non? Nous avons utilis la classe PlaneProjection - http://
msdn.microsoft.com/fr-fr/library/system.windows.media.planeprojection(v=
vs.95).aspx pour le raliser. Il existe une autre classe permettant de faire des projec-
tions suivant une matrice 3D, il sagit de la classe Matrix3DProjection - http://msdn.
microsoft.com/fr-fr/library/system.windows.media.matrix3dprojection(v=vs.
95).aspx mais je pense que vous ne vous servirez que de la projection plane.
Alors, cest trs joli comme a, mais combin une animation, cest encore mieux.
Prenons le XAML suivant :
1 <phone:PhoneApplicationPage.Resources >
2 <Storyboard x:Name="Sb">
3 <DoubleAnimation Storyboard.TargetName="Projection"
Storyboard.TargetProperty="RotationZ"
4 From="0" To="360" Duration="0:0:5"
/>
125
CHAPITRE 10. CRER DES ANIMATIONS
5 <DoubleAnimation Storyboard.TargetName="Projection"
Storyboard.TargetProperty="RotationY"
6 From="0" To="360" Duration="0:0:5"
/>
7 </Storyboard >
8 </phone:PhoneApplicationPage.Resources >
9 <StackPanel >
10 <Image Source="http :// uploads.siteduzero.com/files/
365001_366000/365350.jpg">
11 <Image.Projection >
12 <PlaneProjection x:Name="Projection" RotationX="0"
RotationY="0" RotationZ="0" />
13 </Image.Projection >
14 </Image >
15 </StackPanel >
Vous vous doutez que je vais animer la rotation sur laxe des Y et sur laxe des Z de 0
360 degrs pendant une dure de 5 secondes . . . Dicile de vous montrer le rsultat,
mais je ne peux que vous encourager tester chez vous (voir la gure 10.11).
Figure 10.11 Animation dune projection 3D
Vous naurez bien sr pas oubli de dmarrer lanimation, par exemple depuis lvne-
ment de chargement de page :
1 public MainPage ()
2 {
3 InitializeComponent ();
4 Loaded += MainPage_Loaded;
5 }
126
PROJECTIONS 3D
6
7 void MainPage_Loaded(object sender , RoutedEventArgs e)
8 {
9 Sb.Begin ();
10 }
En rsum
Le XAML possde un framework complexe danimation.
Blend se rvle un atout de qualit dans la ralisation danimations complexes.
Les projections 3D permettent dajouter un eet de perspective 3D dont le rendu
est plutt intressant.
127
CHAPITRE 10. CRER DES ANIMATIONS
128
Deuxime partie
Un mobile orient donnes
129
Chapitre 11
Une application plusieurs pages, la
navigation
Dicult :
Pour linstant, notre application est simple, avec une unique page. Il est bien rare quune
application nait quune seule page. . . Cest comme pour un site internet, imaginons que
nous ralisions une application mobile pour commander des produits, nous aurons une page
contenant la liste des produits par rayon, une page pour acher la description dun produit,
une page pour commander. . .
Nous allons donc voir quil est possible de naviguer facilement entre les pages de notre
application grce au service de navigation de Windows Phone.
131
CHAPITRE 11. UNE APPLICATION PLUSIEURS PAGES, LA NAVIGATION
Naviguer entre les pages
Avant de pouvoir naviguer entre des multiples pages, il faut eectivement avoir plu-
sieurs pages ! Nous allons illustrer cette navigation en prenant pour exemple le site
OpenClassrooms. . . enn, en beaucoup beaucoup moins bien.
Premire fonctionnalit, il faut pouvoir se loguer an datteindre la page des cours.
Nous allons donc avoir deux pages, une qui permet de se loguer, et une qui permet
dacher la liste des cours.
Commenons par la page pour se loguer et vu quelle existe, utilisons la page
MainPage.xaml :
1 <Grid x:Name="LayoutRoot" Background="Transparent">
2 <Grid.RowDefinitions >
3 <RowDefinition Height="Auto"/>
4 <RowDefinition Height="*"/>
5 </Grid.RowDefinitions >
6
7 <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12 ,17,
0,28">
8 <TextBlock x:Name="ApplicationTitle" Text="D
monstration de la navigation" Style="{StaticResource
PhoneTextNormalStyle}"/>
9 <TextBlock x:Name="PageTitle" Text="Page de Login"
Margin="9,-7,0,0" Style="{StaticResource
PhoneTextTitle1Style}"/>
10 </StackPanel >
11
12 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12 ,0,12 ,0"
>
13 <StackPanel >
14 <TextBlock Text="Saisir votre login"
HorizontalAlignment="Center" />
15 <TextBox x:Name="Login"/>
16 <Button Content="Se connecter" Tap="Button_Tap" />
17 </StackPanel >
18 </Grid >
19 </Grid >
Noubliez pas de gnrer chaque fois les vnements des contrles, si ce
nest pas dj fait. Dans lexemple prcdent : Button_Tap.
Pour que cela soit plus simple, nous utilisons uniquement un login pour nous connecter.
Si nous achons la page dans lmulateur, nous avons la gure 11.1.
Nous allons maintenant crer une deuxime page permettant dacher la liste des
cours. Crons donc une autre page que nous nommons ListeCours.xaml. Pour cela,
nous faisons un clic droit sur le projet et choisissons dajouter un nouvel lment. Il
132
NAVIGUER ENTRE LES PAGES
Figure 11.1 Achage de la page de login
sut de choisir le modle de chier Page en mode portrait Windows Phone et de lui
donner le bon nom (voir la gure 11.2).
Dans cette page, nous allons acher simplement bonjour et que la page est en construc-
tion. Pour cela, un XAML trs minimaliste :
1 <Grid x:Name="LayoutRoot" Background="Transparent">
2 <Grid.RowDefinitions >
3 <RowDefinition Height="Auto"/>
4 <RowDefinition Height="*"/>
5 </Grid.RowDefinitions >
6
7 <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,
0,28">
8 <TextBlock x:Name="ApplicationTitle" Text="D
monstration de la navigation" Style="{StaticResource
PhoneTextNormalStyle}"/>
9 <TextBlock x:Name="PageTitle" Text="Page des cours"
Margin="9,-7,0,0" Style="{StaticResource
PhoneTextTitle1Style}"/>
10 </StackPanel >
11
12 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12 ,0,12,0"
>
13 <Grid.RowDefinitions >
133
CHAPITRE 11. UNE APPLICATION PLUSIEURS PAGES, LA NAVIGATION
Figure 11.2 Ajout dune nouvelle page XAML dans le projet
14 <RowDefinition Height="200" />
15 <RowDefinition Height="*" />
16 </Grid.RowDefinitions >
17 <TextBlock x:Name="Bonjour" Text="Bonjour"
HorizontalAlignment="Center" />
18 <TextBlock Grid.Row="1" Text="Cette page est en
construction ..." />
19 </Grid >
20 </Grid >
Retournons dans la mthode de clic sur le bouton de la premire page. Nous allons
utiliser le code suivant :
1 private void Button_Tap(object sender , System.Windows.Input.
GestureEventArgs e)
2 {
3 if (! string.IsNullOrEmpty(Login.Text))
4 NavigationService.Navigate(new Uri("/ListeCours.xaml",
UriKind.Relative));
5 }
Nous utilisons le service de navigation et notamment sa mthode Navigate pour acc-
der la page ListeCours.xaml, si le login nest pas vide. Grce cette mthode, nous
pouvons aller facilement sur la page en construction. Remarquons que si nous appuyons
sur le bouton en bas gauche du tlphone permettant de faire un retour arrire, alors
nous revenons la page prcdente. Si nous cliquons nouveau sur le retour arrire,
134
NAVIGUER ENTRE LES PAGES
alors nous quittons lapplication car il ny a pas de page prcdente. Bon, cest trs
bien tout a, mais si on pouvait acher un bonjour personnalis, a serait pas plus
mal, avec par exemple le login saisi juste avant . . . Il y a plusieurs solutions pour faire
cela. Une des solutions consiste utiliser la query string. Elle permet de passer des
informations complmentaires une page, un peu comme pour les pages web. Pour
cela, on utilise la syntaxe suivante :
1 Page.xaml?parametre1=valeur1¶metre2=valeur2
Modions donc notre mthode pour avoir :
1 private void Button_Tap(object sender , System.Windows.Input.
GestureEventArgs e)
2 {
3 if (! string.IsNullOrEmpty(Login.Text))
4 NavigationService.Navigate(new Uri("/ListeCours.xaml?
login=" + Login.Text , UriKind.Relative));
5 }
Dsormais, la page ListeCours sera appele avec le paramtre login qui vaudra la
valeur saisie dans la TextBox. Pour rcuprer cette valeur, rendez-vous dans le code
behind de la seconde page o nous allons substituer la mthode appele lorsquon
navigue sur la page, il sagit de la mthode OnNavigatedTo, cette mthode faisant
partie de la classe PhoneApplicationPage. Nous aurons donc le code behind suivant :
1 public partial class ListeCours : PhoneApplicationPage
2 {
3 public ListeCours ()
4 {
5 InitializeComponent ();
6 }
7
8 protected override void OnNavigatedTo(System.Windows.
Navigation.NavigationEventArgs e)
9 {
10 base.OnNavigatedTo(e);
11 }
12 }
Cest cet endroit que nous allons extraire la valeur du paramtre avec le code suivant :
1 protected override void OnNavigatedTo(System.Windows.Navigation
.NavigationEventArgs e)
2 {
3 string login;
4 if (NavigationContext.QueryString.TryGetValue("login", out
login))
5 {
6 Bonjour.Text += " " + login;
7 }
8 base.OnNavigatedTo(e);
9 }
135
CHAPITRE 11. UNE APPLICATION PLUSIEURS PAGES, LA NAVIGATION
On utilise la mthode TryGetValue en lui passant le nom du paramtre. Cette m-
thode fait partie de lobjet QueryString du contexte de navigation accessible via
NavigationContext. Ce qui nous donne la gure 11.3.
Figure 11.3 Achage de la seconde page
Une autre solution pour passer des informations de page en page serait dutiliser le
dictionnaire dtat de lapplication an de communiquer un contexte la page vers
laquelle nous allons naviguer. Il sagit dun objet accessible de partout o nous pouvons
stocker des informations et les lier une cl. Cela donne :
1 private void Button_Tap(object sender , System.Windows.Input.
GestureEventArgs e)
2 {
3 if (! string.IsNullOrEmpty(Login.Text))
4 {
5 PhoneApplicationService.Current.State["login"] = Login.
Text;
6 NavigationService.Navigate(new Uri("/ListeCours.xaml",
UriKind.Relative));
7 }
8 }
Et pour rcuprer la valeur dans la deuxime page, nous ferons :
1 protected override void OnNavigatedTo(System.Windows.Navigation
.NavigationEventArgs e)
2 {
136
NAVIGUER ENTRE LES PAGES
3 string login = (string)PhoneApplicationService.Current.
State["login"];
4 Bonjour.Text += " " + login;
5 base.OnNavigatedTo(e);
6 }
Lutilisation du dictionnaire dtat est trs pratique pour faire transiter un objet com-
plexe qui sera dicilement reprsentable dans des paramtres de query string.
Attention : le dictionnaire dtat ne doit contenir que des informations sria-
lisables.
Voil pour ce premier aperu du service de navigation. Remarquez que le XAML
possde galement un contrle qui permet de naviguer entre les pages, comme le
NavigationService. Il sagit du contrle HyperlinkButton - http://msdn.microsoft.
com/fr-fr/library/system.windows.controls.hyperlinkbutton(v=vs.95).aspx.
Il sura de renseigner sa proprit NavigateUri. Compltons notre page ListeCours
pour rajouter en bas un HyperLinkButton qui renverra vers une page Contact.xaml :
1 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12 ,0,12,0">
2 <Grid.RowDefinitions >
3 <RowDefinition Height="200" />
4 <RowDefinition Height="*" />
5 <RowDefinition Height="auto" />
6 </Grid.RowDefinitions >
7 <TextBlock x:Name="Bonjour" Text="Bonjour"
HorizontalAlignment="Center" />
8 <TextBlock Grid.Row="1" Text="Cette page est en
construction ..." />
9 <HyperlinkButton Grid.Row="2" Content="Nous contacter"
NavigateUri="/Contact.xaml" />
10 </Grid >
Puis crons une page Contact.xaml :
1 <Grid x:Name="LayoutRoot" Background="Transparent">
2 <Grid.RowDefinitions >
3 <RowDefinition Height="Auto"/>
4 <RowDefinition Height="*"/>
5 </Grid.RowDefinitions >
6
7 <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,
0,28">
8 <TextBlock x:Name="ApplicationTitle" Text="D
monstration de la navigation" Style="{StaticResource
PhoneTextNormalStyle}"/>
9 <TextBlock x:Name="PageTitle" Text="Nous contacter"
Margin="9,-7,0,0" Style="{StaticResource
PhoneTextTitle1Style}"/>
137
CHAPITRE 11. UNE APPLICATION PLUSIEURS PAGES, LA NAVIGATION
10 </StackPanel >
11
12 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12 ,0,12 ,0"
>
13 <StackPanel >
14 <TextBlock Text="Il n'y a rien pour l'instant ..."
/>
15 <Button Content="Revenir la page prcdente" Tap=
"Button_Tap" />
16 </StackPanel >
17 </Grid >
18 </Grid >
Ainsi, lorsque nous dmarrerons lapplication et aprs nous tre logus, nous pouvons
voir le bouton nous contacter en bas de la page (voir la gure 11.4).
Figure 11.4 Utilisation du contrle HyperLinkButton pour la navigation
Un clic dessus nous amne la page de contact (voir la gure 11.5).
Et voil, la navigation est rendue trs simple avec ce contrle, nous naviguons entre les
pages de notre application en nayant presque rien fait, part ajouter un contrle
HyperlinkButton. Il sait grer facilement une navigation avec des liens entre des
pages. Cest la forme de navigation la plus simple. Nous avons pu voir ainsi deux
faons direntes de naviguer entre les pages, via le contrle HyperlinkButton et via
le NavigationService. Puis nous avons vu deux faons direntes de passer des infor-
mations entre les pages, via la query string et via le dictionnaire dtat de lapplication.
138
GRER LE BOUTON DE RETOUR ARRIRE
Figure 11.5 Achage de la page de contact
On remarque que la premire page sacher lorsquon dmarre une appli-
cation est la page MainPage.xaml. Ceci est congurable en allant modier
le chier WMAppManifest.xml qui se trouve dans lexplorateur de solutions,
sous properties (voir la gure 11.6).
Double-cliquez dessus et une nouvelle page souvre permettant de saisir une autre page
de dmarrage (voir la gure 11.7).
Grer le bouton de retour arrire
Et pour revenir en arrire ? Nous lavons vu, il faut cliquer sur le bouton de retour
arrire qui fait ncessairement partie dun tlphone Windows Phone. Mais il est ga-
lement possible de dclencher ce retour arrire grce au service de navigation. Cest
cela que va servir le bouton que jai rajout dans la page Contact.xaml. Observons
lvnement associ au clic :
1 private void Button_Tap(object sender , System.Windows.Input.
GestureEventArgs e)
2 {
3 NavigationService.GoBack ();
4 }
139
CHAPITRE 11. UNE APPLICATION PLUSIEURS PAGES, LA NAVIGATION
Figure 11.6 Le chier WMAppManifest.xml dans lexplorateur de solutions
Figure 11.7 Le concepteur permettant de modier la page XAML de dmarrage de
lapplication
140
GRER LE BOUTON DE RETOUR ARRIRE
Trs simple, il sut de dclencher le retour arrire avec la mthode GoBack() du service
de navigation. Notez quil peut tre utile dans certaines situations de tester si un retour
arrire est eectivement possible. Cela se fait avec la proprit CanGoBack :
1 private void Button_Tap(object sender , System.Windows.Input.
GestureEventArgs e)
2 {
3 if (NavigationService.CanGoBack)
4 NavigationService.GoBack ();
5 }
Il est galement possible de savoir si lutilisateur a appuy sur le fameux bouton de
retour arrire. ce moment-l, on passera dans la mthode OnBackKeyPress. Pour
pouvoir faire quelque chose lors de ce clic, on pourra substituer cette mthode dans
notre classe :
1 protected override void OnBackKeyPress(System.ComponentModel.
CancelEventArgs e)
2 {
3 base.OnBackKeyPress(e);
4 }
Il est possible ici de faire ce que lon veut, comme acher un message de conrmation
demandant si on veut rellement quitter cette page, ou sauvegarder des infos, etc. On
pourra annuler laction de retour arrire en modiant la proprit Cancel de lobjet
CancelEventArgs true, si par exemple lutilisateur ne souhaite nalement pas revenir
en arrire. On peut galement choisir de rediriger vers une autre page si cest pertinent :
1 protected override void OnBackKeyPress(System.ComponentModel.
CancelEventArgs e)
2 {
3 if (MessageBox.Show("Vous n'avez pas sauvegard votre
travail , voulez -vous vraiment quitter cette page ?", "
Attention", MessageBoxButton.OKCancel) ==
MessageBoxResult.Cancel)
4 {
5 e.Cancel = true;
6 }
7 base.OnBackKeyPress(e);
8 }
Qui donne la gure 11.8.
Et voil pour les bases de la navigation. Dune manire gnrale, il est de bon ton de
garder une mcanique de navigation uide et cohrente. Il faut privilgier la navigation
intuitive pour que lutilisateur ne soit pas perdu dans un labyrinthe dcran. . .
141
CHAPITRE 11. UNE APPLICATION PLUSIEURS PAGES, LA NAVIGATION
Figure 11.8 Achage dune conrmation avant de quitter la page
Ajouter une image daccueil (splash screen)
Il est maintenant dun usage commun de faire en sorte quau dmarrage de son appli-
cation il y ait une image pour faire patienter lutilisateur pendant que tout se charge.
On appelle cela en gnral de son nom anglais : Splash screen, que lon peut traduire
en image daccueil. On y trouve souvent un petit logo de lapplication ou de lentre-
prise qui la ralis, pourquoi pas le numro de version,. . . bref, des choses pour faire
patienter lutilisateur et lui dire que lapplication va bientt dmarrer. Avec Windows
Phone, il est trs facile de raliser ce genre dimage daccueil, il sut de rajouter (si
elle nest pas dj prsente) une image sappelant SplashScreenImage.jpg la racine
du projet. Elle doit avoir son action de gnration Contenu (voir la gure 11.9).
Pour les applications Windows Phone 8, elle doit avoir la taille 768x1280 pixels alors
que pour les applications Windows Phone 7.X elle devra tre de 480x800 (voir la gure
11.10).
Vous noterez au passage mon talent de dessinateur et ma grande force exploiter toute
la puissance des formes de Paint.
142
AJOUTER UNE IMAGE DACCUEIL (SPLASH SCREEN)
Figure 11.9 Limage daccueil dans lexplorateur de solutions
Figure 11.10 Achage de lcran daccueil dans lmulateur
143
CHAPITRE 11. UNE APPLICATION PLUSIEURS PAGES, LA NAVIGATION
Le tombstonning
Avec Windows Phone 7 est apparu un changement radical dans la faon dont sont
traites les applications. Fini le multitche comme on le connaissait auparavant avec
un Windows classique, il ny a dsormais quune application qui sexcute la fois.
Cela veut dire que si je suis dans une application, que jappuie sur le bouton de menu
et que jouvre une nouvelle application, je nai pas deux applications qui tournent en
parallle, mais une seule. Ma premire application ne sest pas ferme non plus, elle
est passe dans un mode suspendu , voire dsactiv en fonction du contexte.
Ainsi, si je quitte ma seconde application en appuyant par exemple sur le bouton de
retour arrire, alors ma premire application qui tait en mode suspendu ou dsactiv,
se ractive et repasse dans le mode en cours dexcution.
Ce fonctionnement est conserv pour Windows Phone 8 et a t galement tendu pour
les applications Windows 8. Une application peut donc soit tre :
En cours dexcution
Suspendue
Dsactive
Non dmarre
Lorsque lapplication passe en mode suspendu, par exemple lorsque jappuie sur le
bouton de menu, elle reste intacte en mmoire. Cela veut dire quun retour arrire
pour retourner lapplication sera trs rapide et vous retrouverez votre application
comme elle se trouvait prcdemment.
Enn, a, cest la thorie. En vrai, cest un peu plus compliqu que a. Cest le systme
dexploitation qui soccupe de grer les tats des applications en fonction notamment
de la mmoire disponible. En eet, Windows Phone peut choisir de dsactiver une
application suspendue si lapplication en cours dexcution a besoin de mmoire. De
la mme faon, lapplication peut avoir simplement t suspendue et se ractiver de
manire optimale si le systme dexploitation na pas eu besoin de mmoire. Une ap-
plication dsactive a t termine par le systme dexploitation, bien souvent parce
quil avait besoin de mmoire. Quelques informations restent cependant disponibles et
si lutilisateur revient sur lapplication, celle-ci est alors redmarre depuis zro mais
ces informations sont accessibles an de permettre de restaurer ltat de lapplication.
Tout ceci implique que lon ne peut jamais garantir que lutilisateur va fermer correcte-
ment une application ou que celle-ci va se terminer proprement, cest mme dailleurs
rarement le cas. Il peut y avoir plein de scnarios possibles. Par exemple votre utilisateur
est en train de saisir des informations dans votre application, il change dapplication
pour aller lire un mail, voir la mto, puis plus tard il revient votre application; entre
temps il a reu un coup de tlphone, recharg son tlphone . . . Quest devenue notre
application ? Comment apporter lutilisateur tout le confort dutilisation possible et
lui garantir quil na pas perdu toute sa saisie ? Heureusement, lorsque lapplication
change dtat, nous pouvons tre prvenus grce des vnements. Ce sont des vne-
ments applicatifs que lon retrouve dans le chier dapplication que nous avons dj vu :
App.xaml. Par contre, ici nous allons nous intresser son code behind : App.xaml.cs
et notamment aux vnements dj gnrs pour nous. Ouvrez-le et vous pouvez voir :
144
LE TOMBSTONNING
1 // Code excuter lorsque l'application dmarre (par exemple ,
partir de Dmarrer)
2 // Ce code ne s'excute pas lorsque l'application est ractive
3 private void Application_Launching(object sender ,
LaunchingEventArgs e)
4 {
5 }
6
7 // Code excuter lorsque l'application est active (affiche
au premier plan)
8 // Ce code ne s'excute pas lorsque l'application est dmarre
pour la premire fois
9 private void Application_Activated(object sender ,
ActivatedEventArgs e)
10 {
11 }
12
13 // Code excuter lorsque l'application est dsactive (envoy
e l'arrire-plan)
14 // Ce code ne s'excute pas lors de la fermeture de l'
application
15 private void Application_Deactivated(object sender ,
DeactivatedEventArgs e)
16 {
17 }
18
19 // Code excuter lors de la fermeture de l'application (par
exemple , lorsque l'utilisateur clique sur Prcdent)
20 // Ce code ne s'excute pas lorsque l'application est dsactiv
e
21 private void Application_Closing(object sender ,
ClosingEventArgs e)
22 {
23 }
Les commentaires gnrs parlent deux-mmes. Ces mthodes sont donc lendroit idal
pour faire des sauvegardes de contexte. Voici la gure 11.11 un schma rcapitulatif
des dirents tats.
- Action vnement applicatif
1 Dmarrage Launching
2 Dsactivation Deactivated
3 Reprise rapide Activated
4 Reprise lente Activated
5 Fermeture Closing
6 Fermeture force par lOS -
145
CHAPITRE 11. UNE APPLICATION PLUSIEURS PAGES, LA NAVIGATION
Figure 11.11 Les dirents tats dune application Windows Phone
Lvnement Closing nest pas lev lorsque cest le systme dexploitation
qui choisit de terminer lapplication, par manque de ressources par exemple.
Imaginons que je sois en train de saisir un long texte dans mon application, que mon
tlphone sonne et que je doive partir durgence. Lapplication va commencer par pas-
ser en mode suspendu. Si je retourne dans mon application rapidement en appuyant
sur le retour arrire, alors je vais retrouver mon texte intact. Par contre, si celle-ci est
dsactive par le systme dexploitation, alors je peux dire adieu ma saisie. Et l, je
risque de maudire cette application et ne plus jamais lutiliser. Et cest encore pire si
cest moi qui relance depuis zro lapplication depuis le menu, je ne pourrais mme pas
maudire le systme dexploitation. Une solution est de sauvegarder ce texte au fur et
mesure de sa saisie. Comme a, si jamais lapplication est dsactive, je pourrai alors
proter des vnements applicatifs pour enregistrer ce texte dans la mmoire du tl-
phone, an de le repositionner si jamais lutilisateur r-ouvre lapplication. Mais avant
cela, essayons de bien comprendre le processus dactivation/dsactivation et modions
MainPage.xaml pour avoir ceci :
1 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12 ,0,12 ,0">
2 <StackPanel >
3 <TextBox />
4 </StackPanel >
5 </Grid >
Et dans le code-behind :
146
LE TOMBSTONNING
1 public partial class MainPage : PhoneApplicationPage
2 {
3 private bool _estNouvelleInstance = false;
4 private string laPage; // info conserver
5
6 public MainPage ()
7 {
8 InitializeComponent ();
9 _estNouvelleInstance = true;
10 }
11
12 protected override void OnNavigatedFrom(System.Windows.
Navigation.NavigationEventArgs e)
13 {
14 if (e.NavigationMode != System.Windows.Navigation.
NavigationMode.Back)
15 {
16 // l'appli est dsactive, la page est quitte
17 State["MainPage"] = laPage;
18 }
19 else
20 {
21 // on quitte l'appli en appuyant sur back
22 }
23 }
24
25 protected override void OnNavigatedTo(System.Windows.
Navigation.NavigationEventArgs e)
26 {
27 if (_estNouvelleInstance)
28 {
29 if (State.Count > 0)
30 {
31 // application a t dsactive par l'OS, on
peut accder au dictionnaire d'tat
32 // pour restaurer les infos
33 laPage = (string)State["MainPage"];
34 }
35 else
36 {
37 // quivalent un dmarrage de l'appli
38 laPage = "MainPage";
39 }
40 }
41 else
42 {
43 // la page est garde en mmoire , pas besoin d'
aller lire le dictionnaire d'tat
44 }
45 _estNouvelleInstance = false;
147
CHAPITRE 11. UNE APPLICATION PLUSIEURS PAGES, LA NAVIGATION
46 }
47 }
Jespre que les commentaires sont assez explicites. Ce quil faut retenir cest que si
nous dmarrons lapplication en appuyant sur