c # Uri загрузка недетерминированная? - PullRequest
6 голосов
/ 19 апреля 2011

Я пытаюсь загрузить некоторые BitmapImages из файлов, хранящихся в файловой системе. У меня есть словарь ключей и относительных путей к файлам. К сожалению, конструктор Uri кажется недетерминированным в том, как он будет загружать изображения.

Вот мой код:

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);

    }
}

К сожалению, иногда Uris загружаются как относительный файл Uris, а иногда они загружаются как относительный пакет Uris. Кажется, что нет никакой рифмы или причины, по которой будет загружен какой путь. Иногда я загружаю весь Uris в одну сторону, или пару, или большинство из них, и он меняется каждый раз, когда я запускаю код.

Есть идеи, что здесь происходит?

Ответы [ 2 ]

3 голосов
/ 21 апреля 2011

Ну, вроде ... MSDN говорит об UriKind:

Абсолютные URI характеризуются полной ссылкой на ресурс (пример: http://www.contoso.com/index.html), , а относительный URI зависит от ранее определенного базового URI (пример: /index.html)

Если вы прыгаете в отражатель и оглядываетесь вокруг, вы можете увидеть, что есть много путей для кода, чтобы решить, каким должен быть относительный URI. Как бы то ни было, дело не в том, что он недетерминированный, а в том, что он является основным источником разочарования для многих разработчиков. Одна вещь, которую вы можете сделать, это воспользоваться классом ' BaseUriHelper ', чтобы понять, как решаются ваши урисы.

С другой стороны, если вы знаете, где хранятся ваши ресурсы (и вам следует), я бы посоветовал вам просто избавить себя от головной боли и использовать абсолютный URI для разрешения ваших ресурсов. Работает каждый раз, и нет никакого тупого кода за кулисами, чтобы сбить вас с толку, когда вы меньше всего этого ожидаете.

1 голос
/ 28 апреля 2011

В конце концов я решил проблему, получив базовый каталог моего приложения и добавив к нему относительный путь и используя абсолютный URI, а не относительный.

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);

    }
}
...