我在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
与链接文件一起使用会出现某种问题。但为什么呢?
答案 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方案。如果将文件添加为链接或复制,则此行为不依赖于此,它取决于文件的导出方式。