c# Uri加载不确定

本文关键字:不确定 加载 Uri | 更新日期: 2023-09-27 17:50:25

我正在尝试从文件系统上保存的文件加载一些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);
    }
}

不幸的是,有时uri被加载为相对文件uri,有时它们被加载为相对包uri。似乎没有任何押韵或理由,以哪种方式装载。有时我以一种方式加载所有uri,或者只加载几个uri,或者大多数uri,每次运行代码时都会发生变化。

你知道这是怎么回事吗?

c# Uri加载不确定

嗯,有点…MSDN对UriKind有如下说明:

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

如果您跳转到reflector并环顾四周,您可以看到代码有很多路径来解析相对URI应该是什么。无论如何,这并不是说它是不确定的,它只是许多开发人员受挫的主要来源。您可以做的一件事是空'BaseUriHelper'类,以了解如何解析uri。

另一方面,如果你知道你的资源被存储在哪里(你应该知道),我建议你不要自找麻烦,使用绝对URI来解析你的资源。每次都能正常工作,并且不会在您最意想不到的时候出现愚蠢的代码。

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