Lorsque l’on parle d’une Uri relative, à quoi est-elle relative ?
Au fichier XMAL/VB/C# dans lequel le lien se trouve. La réponse parait simple mais elle mérite attention.- Cela change nos habitude car nous sommes souvent plus familliés avec les Uri relatives au site Web
- L'écriture de nos Uri dépend de la position de nos fichier XAML/VB/C#
Actions de génération (Build Action)
L’explorateur de propriété permet de définir une ‘action de génération’ pour chaque fichier. Par défaut, lorsque l’on intègre une image dans un projet Silverlight, l’action de génération est ‘Ressource’.
Trois types d’action de génération sont à retenir :
- Ressource (Resource)
- Contenu (Content)
- Aucun (None)
En imaginant que :
- le nom de l’assembly est ‘Test’ (Pour retrouver le nom, voir dans les propriétés du projet, onglet Silverlight).
- Le nom du fichier est ‘monimage.jpg’
- Que le fichier est dans un dossier ‘Images’ (un dossier dans le projet, pas un dossier dans le site Web).
Si action de génération = Ressource
Le fichier sera inclus dans l’assembly en tant que ressource.
Dans ce cas, un simple chemin relatif à la ressource suffit parfois (par relatif il faut entendre, relatif à la position du fichier XAML/VB/C# dans lequel est utilisé l’Uri). Mais cela peut très vite devenir compliqué surtout si vous créez et utilisez des contrôles (utilisateurs ou non). Je vous recommande donc les syntaxes suivantes.
Uri en XAML :
"Test;component/Images/monimage.jpg"
Uri en c# :
Uri("Test;component/Images/Saisie_ monimage.png", UriKind.Relative);
Note : Cette façon de procéder permet en fait de toujours écrire des Uri relatives à la racine de l’assembly.
Si action de génération = Contenu
Le fichier sera inclus dans le XAP. Dans notre exemple, cela implique q’un dossier ‘Images’ sera créé dans le XAP (qui pour le rappeler n’est en fait qu’un fichier zip), et que le fichier ‘monimage.jpg’ y sera placée.
Dans ce cas, les syntaxes suivantes peuvent être utilisées.
Uri en XAML :
Uri en c# :
new Uri("/Images/monimage.png", UriKind.Relative);
Note : Notez la présence du ‘/’ en début d’Uri. Cette fois ci, l’Uri est relative à la racine du fichier XAP.
Si action de génération = Aucun
Dans ce cas, en plus de définir ‘action de génération’, définissez aussi ‘Copier dans le répertoire de sortie’. Le fichier sera copié dans ClientBin.
Les syntaxes suivantes peuvent être utilisées.
Uri en XAML :
Uri en c# :
new Uri("/Images/monimage.png", UriKind.Relative);
Note : J’ai plusieurs fois eu des soucis de copie de fichiers non effectués avec cette méthode. Je préfère généralement copier moi-même mes fichiers dans le site Web (dans ClientBin), sans les inclure dans le projet Silverlight.
Note : Vous remarquerez que la syntaxe pour accéder à un fichier dans le XAP ou dans le ClientBin est la même. En cas de conflit de nom, c’est le XAP qui gagne.
Note : Pour remonter l’arborescence du site Web en amont de ClientBin, il faut utiliser une Uri absolue. Le mieux c’est de la construire via le code en utilisant
Application.Current.Host.Source.AbsolutePath
Conclusion
Cette description demande sans doute à être complètée, je suis preneur de toute nouvelle info.
Partager