当我尝试使用作为链接添加到项目中的图像文件时,为什么会出现IOException?

时间:2009-09-16 04:05:34

标签: c# wpf visual-studio relative-path

我在WPF中有一个IValueConverter,可以将相对文件路径转换为BitmapImage

守则:

public class RelativeImagePathToImage : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var relativePath = (string)value;
        if (string.IsNullOrEmpty(relativePath)) return Binding.DoNothing;
        var path = "pack://application:,,,/" + value;
        var uri = new Uri(path);
        return new BitmapImage(uri);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return Binding.DoNothing;
    }
}

问题:

此转换器工作正常,直到我尝试将其与作为链接添加到项目中的文件一起使用(解决方案资源管理器 - >添加现有项目 - >添加为链接)。图像文件的BuildAction设置为Content,文件标记为Copy Always。该文件肯定会被正确复制到“bin”文件夹,但由于某种原因,转换器在到达return new BitmapImage(uri)时会窒息。

例外:

System.IO.IOException was unhandled
Message="Cannot locate resource 'images/splash.png'."
Source="PresentationFramework"

问题:

有人可以解释一下吗?这是.NET Framework中的错误还是预期的行为?是否有解决方法或“添加为链接”只是不是图像内容文件的选项?

修改

好的,我找到了解决方法。这是我修改过的转换器类:

public class RelativeImagePathToImage : IValueConverter
{
    private static string _rootPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var relativePath = (string)value;
        if (string.IsNullOrEmpty(relativePath)) return Binding.DoNothing;
        var path = _rootPath + "/" + relativePath;
        var uri = new Uri(path);
        return new BitmapImage(uri);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return Binding.DoNothing;
    }
}

显然,将packuri与链接文件一起使用会出现某种问题。但为什么呢?

2 个答案:

答案 0 :(得分:2)

答案是使用pack://siteoforigin:,,,/而不是pack://application:,,,/

pack://siteoforigin适用于任何被复制到bin / Debug或bin / Release文件夹(或其中的任何子文件夹)的内容文件,无论文件是作为链接添加到项目还是正常。< / p>

path://application仅适用于正常添加的内容文件(不作为链接)。

答案 1 :(得分:1)

pack:// uri scheme仅用于资源目录中的文件,如果您只是添加文件或添加文件作为链接并将其类型设置为“content”,它将仅复制您的bin中的文件文件夹,但它不会打包在应用程序资源目录中。

因此对于作为单个文件存在于目录中的文件,您不能使用pack uri方案,您必须使用正常路径的文件uri方案。如果将文件添加为链接或复制,则此行为不依赖于此,它取决于文件的导出方式。