Silverlight: accéder à des fichiers en dehors du répertoire ClientBin

Accéder à un fichier quelconque sur votre site web est une action très courante dans les scénarios RIA. C’est d’ailleurs très facile avec Silverlight, si vos ressources se situent dans le répertoire ClientBin, ou si vous disposez de l’URI absolue (complète) du fichier en question. Malheureusement, la notation ../ ne permet pas à ce jour de remonter au dessus du répertoire ClientBin. Ce post montre une solution permettant d’accéder à un fichier hors de ce répertoire et de façon relative.

Imaginons que vous souhaitiez accéder aux fichiers Images/MyRobots.jpg ou Desert.jpg, tous deux hors du répertoire ClientBin :

image

Comme mentionné précédemment, l’utilisation de ../ ou / dans vos URI Silverlight 3 ne permettra pas de remonter dans l’arborescence. La seule façon d’accéder à ces images serait d’utiliser une URI absolue (du type https://www.abc.com/mysite/Images/MyRobots.jpg ), ce qui ne vous conviendra probablement pas car il faudrait recompiler votre application si votre site vient à être déplacé.

La solution consiste à déterminer au runtime, le chemin absolu de votre application et de l’utiliser comme préfixe aux ressources auquelles vous souhaitez accéder. Cette adresse est obtenue par le biais du code suivant:

Application.Current.Host.Source.AbsoluteUri

Puis supprimez simplement ClientBin :

Regex.Replace(Application.Current.Host.Source.AbsoluteUri, @"ClientBin/[\w/.]*", string.Empty);

Comme à l’habitude, un projet exemple est attaché à ce post, et il fait usage de cette technique par le biais d’un Binding et d’un converter, et par une propriété statique.

<Image Source="{Binding Converter={StaticResource WebSiteRelativeURIConverter},ConverterParameter=Images/,Path=MyImageFilename/>

image

En espérant que vous trouverez cela utile :)

RelativeExternalUris_fr.zip