6 votes

c# Chargement d'Uri non déterministe ?

J'essaie de charger des images bitmap à partir de fichiers contenus dans le système de fichiers. J'ai un dictionnaire de clés et des chemins de fichiers relatifs. Malheureusement, le constructeur d'Uri ne semble pas déterministe dans la manière dont il charge les images.

Voici mon code :

foreach(KeyValuePair<string, string> imageLocation in _imageLocations)
{
    try
    {
        BitmapImage img = new BitmapImage();
        img.BeginInit();
        img.UriSource = new Uri(@imageLocation.Value, UriKind.Relative);

        img.EndInit();
        _images.Add(imageLocation.Key, img);
    }
    catch (Exception ex)
    {
        logger.Error("Error attempting to load image", ex);

    }
}

Malheureusement, parfois les Uris sont chargés comme des Uris de fichiers relatifs et parfois ils sont chargés comme des Uris de paquets relatifs. Il ne semble pas y avoir de rime ou de raison pour déterminer lequel sera chargé de quelle manière. Parfois, tous les Uris se chargent d'une façon, ou seulement quelques-uns, ou la plupart d'entre eux, et cela change à chaque fois que j'exécute le code.

Une idée de ce qui se passe ici ?

3voto

A.R. Points 5329

Eh bien, en quelque sorte... MSDN a ceci à dire à propos de l'UriKind :

Les URI absolus sont caractérisés par une référence complète à la ressource (exemple : http://www.contoso.com/index.html ), alors qu'un Uri relatif dépend d'un URI de base préalablement défini (exemple : /index.html)

Si vous sautez dans reflector et regardez autour de vous, vous verrez qu'il y a beaucoup de chemins à prendre pour le code afin de résoudre ce que l'URI relatif devrait être. Quoi qu'il en soit, ce n'est pas que ce soit non déterministe, c'est plutôt que c'est une source majeure de frustration pour de nombreux développeurs. Une chose que vous pouvez faire est d'utiliser l'option ' BaseUriHelper afin d'aller au fond des choses et de savoir comment vos uris sont résolus.

D'autre part, si vous savez où vos ressources sont stockées (et vous devriez le savoir), je vous suggère de vous épargner ce casse-tête et d'utiliser un URI absolu pour résoudre vos ressources. Cela fonctionne à tous les coups, et il n'y a pas de code loufoque dans les coulisses pour vous faire trébucher quand vous vous y attendez le moins.

1voto

Michael Watson Points 73

Finalement, j'ai résolu le problème en récupérant le répertoire de base de mon application, en y ajoutant le chemin relatif et en utilisant une URI absolue plutôt que relative.

string baseDir = AppDomain.CurrentDomain.BaseDirectory;

foreach(KeyValuePair<string, string> imageLocation in _imageLocations)
{
    try
    {
        BitmapImage img = new BitmapImage();
        img.BeginInit();
        img.UriSource = new Uri("file:///" + baseDir + @imageLocation.Value, UriKind.Absolute);

        img.EndInit();
        _images.Add(imageLocation.Key, img);
    }
    catch (Exception ex)
    {
        logger.Error("Error attempting to load image", ex);

    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X