c #Uri加载非确定性?

时间:2011-04-18 23:21:33

标签: c# wpf uri bitmapimage

我正在尝试从文件系统上保存的文件中加载一些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加载,有时它们会被装载为相对的Pack Uris。似乎没有任何押韵或理由,哪个会以哪种方式加载。有时我会以一种方式加载所有Uris,或只加载一对,或大部分,并且每次运行代码时它都会改变。

这里有什么想法?

2 个答案:

答案 0 :(得分:3)

嗯,有点...... MSDN对UriKind有这个说法:

绝对URI的特点是对资源的完整引用(例如:http://www.contoso.com/index.html),,而相对Uri依赖于先前定义的基URI(例如:/index.html)

如果你跳进反射器并环顾四周,你会发现代码有很多路径可以解决相对URI应该是什么。无论如何,它不是非确定性的,它更多的是它只是许多开发人员的主要挫折源。你可以做的一件事就是“ BaseUriHelper ”这个课程,以深入了解你的uris如何被解决。

另一方面,如果您知道您的资源存储位置(并且您应该),我建议您尽量避免头痛并使用绝对URI来解析您的资源。每次都可以使用,并且在你最不期望的时候,在幕后没有愚蠢的代码来绊倒你。

答案 1 :(得分:1)

最后,我通过获取应用程序的基本目录并附加相对路径并使用绝对URI而不是相对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);

    }
}