• Facile

Ce cours est visible gratuitement en ligne.

Vous pouvez être accompagné et mentoré par un professeur particulier par visioconférence sur ce cours.

J'ai tout compris !

Mis à jour le 29/04/2014

Où est mon application ?

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Nous avons commencé à créer des applications, mais… que sont-elles réellement ? Lorsque nous créons des programmes en C# pour Windows, nous obtenons des fichiers exécutables dont l’extension est .exe. Mais pour un téléphone, comment ça marche ? Et lorsque j’ajoute des images dans ma solution, où finissent-elles ?
Voyons à présent les subtilités de la construction d’applications pour Windows Phone.

Le .XAP

Pour illustrer ce chapitre, créons un nouveau projet, que nous nommerons par exemple DemoXap.
Lorsque nous compilons notre application pour Windows Phone, celle-ci se génère par défaut dans un sous répertoire de notre projet : DemoXap\Bin\Debug, Debug étant le mode de compilation par défaut lorsque nous créons une solution. Nous verrons dans la dernière partie comment passer le mode de compilation en Release.

Toujours est-il que dans ce répertoire, il va s’y générer plein de choses, mais une seule nous intéresse vraiment ici, c’est le fichier qui porte le nom du projet et dont l’extension est .xap. Dans mon cas, il s’appelle DemoXap_Debug_AnyCPU.xap car mon mode de compilation est Debug, Any Cpu (voir la figure suivante).

Le mode de compilation est à Debug, Any Cpu
Le mode de compilation est à Debug, Any Cpu

Qu’est-ce donc que ce fichier ? En fait, c’est une archive au format compressé (zip) qui va contenir tous les fichiers dont notre application va avoir besoin. Si vous l’ouvrez avec votre décompresseur préféré, vous pourrez voir que cette archive contient les fichiers suivants :

  • Assets

    • Tiles

      • FlipCycleTileLarge.png

      • FlipCycleTileMedium.png

      • FlipCycleTileSmall.png

      • IconicTileMediumLarge.png

      • IconicTileSmall.png

    • AlignmentGrid.png

    • ApplicationIcon.png

  • AppManifest.xaml

  • DemoXap.dll

  • WMAppManifest.xml

Plein de choses que nous retrouvons dans notre solution. En fait, tout ce qui est du XAML et du code a été compilé dans l’assembly DemoXap.dll, les fichiers de Manifest sont laissés dans l’archive car ce sont eux qui donnent les instructions concernant la configuration de l’application. Et ensuite, il y a les quelques images.

Ajoutons un nouveau projet à notre solution (clic droit sur la solution > Ajouter > Nouveau projet), de type bibliothèque de classes Windows Phone, que nous nommons MaBibliotheque. Ciblez la plate-forme 8.0 et faites une référence à cette assembly depuis votre application DemoXap.
Compilez et vous pourrez retrouver cette assembly dans le .xap généré. Nous retrouvons donc toutes les assemblys dont le projet a besoin dans ce .xap.

Ajoutez à présent un nouvel élément déjà existant à votre projet et allez chercher une image par exemple. Elle s’ajoute dans la solution et si vous compilez et que vous ouvrez le fichier .xap, alors cette image apparait dedans. C’est parce que votre image est par défaut ajoutée avec l’action de génération à « Contenu ». Si vous changez cette action de génération et que vous mettez « Resource», alors cette fois-ci, elle n’apparait plus dans le .xap.
En fait, un fichier inclus en tant que Resource est compilé à l’intérieur de son assembly. Si vous avez été attentifs aux fichiers, vous aurez pu constater que l’assembly (DemoXap.dll) est beaucoup plus grosse lorsque l’image est compilée en tant que ressource. Tandis que si elle est compilée en tant que contenu, alors celle-ci fait partie du .xap.

Affichage d’images en ressources

Ceci implique des contraintes. Si nous voulons afficher par code une image, nous avons vu que nous pouvions compiler l’image en tant que contenu et utiliser le code suivant :

<Image x:Name="MonImage" />

et

MonImage.Source = new BitmapImage(new Uri("/monimage.png", UriKind.Relative));

Ceci s’explique simplement. Étant donné que l’image est inclue dans le .xap, il va pouvoir aller la chercher tranquillement à l’emplacement /monimage.png, donc à la racine du package.
Essayez désormais de changer l’action de génération à ressource, et vous verrez que l’image ne s’affiche plus. En effet, l’image n’est plus à cet emplacement mais compilée à l’intérieur de l’assembly.
Il est quand même possible d’accéder à son contenu, mais cela demande d’aller lire à l’intérieur de l’assembly, ce que l’on peut faire de cette façon :

MonImage.Source = new BitmapImage(new Uri("/DemoXap;component/monimage.png", UriKind.Relative));

Bien sûr, si l’image n’est pas placée à la racine, mais dans un sous répertoire, il faudra indiquer le sous répertoire dans l’URL de l’image.

Accéder au flux des ressources

Il est possible d’accéder en lecture aux ressources. Cela peut être intéressant par exemple pour lire un fichier texte, xml ou autre. Le fichier doit bien sûr avoir l’action de génération à Ressource. Puis vous pouvez utiliser le code suivant :

StreamResourceInfo sr = Application.GetResourceStream(new Uri("/DemoXap;component/MonFichier.txt", UriKind.Relative));
StreamReader s = new StreamReader(sr.Stream);
MonTextBlock.Text = s.ReadToEnd();
s.Close();
  • Une application Windows Phone est générée sous la forme d’une archive dont l’extension est .xap.

  • On peut embarquer des éléments dans notre assembly en positionnant l’action de génération à Resource.

  • Un élément compilé avec l’action de génération à Contenu sera disponible directement dans le .xap.

Exemple de certificat de réussite
Exemple de certificat de réussite