我正在写一个程序,必须访问从遗留数据文件格式的图像。(具体地说:程序直接从老游戏的数据文件加载UI图像)因为图像都存储为Targa (TGA)文件,所以我必须将它们预处理为PNG文件。我在本地应用程序数据文件夹中执行此操作。
我的问题是使用这些图像编写/创作XAML文件。因为我不想重新分发图像(版权问题),所以我不能将它们作为资源包含在我的应用程序中。这排除了在WPF控件中包含图像的正常方式。
我已经成功地尝试了将预处理的图像放在与应用程序的程序集相同的目录中,并使用"pack://siteoforigin:,,,/cache/image.png“引用它们。这也适用于Visual Studio和Expression Blend 3中的XAML设计器。
这种方法的问题是,作为当前用户,应用程序的目录不一定是可写的(特别是如果应用程序驻留在C:\Program Files中),所以在预处理阶段将图像存储在那里对我来说是不可能的。
我成功使用的另一种方法是创建一个自定义缓存协议,如WebRequest ://,并将其用于图像URL。这在实际应用程序中有效,但在Visual Studio的设计器或表达式Blend中不起作用。
有没有人知道使用WPF在文件系统中引用图像的另一种好方法?或者是一些自定义资源加载的方法,这与通常的WPF创作解决方案兼容?
发布于 2009-10-30 15:36:22
回答我自己的问题:
我必须实现两个MarkupExtensions:一个创建ImageSource,另一个创建ImageBrush。这些类使用相对URL(相对于%appdata%中的本地缓存)创建对象。
然后我可以使用:
<Grid Background="{local:LocalImageBrush Filename=some/relative/filename.png}" />标记扩展的代码是:
class LocalImageBrush : MarkupExtension
{
public string Filename { get; set; }
public override object ProvideValue(IServiceProvider serviceProvider)
{
var result = new Uri("file:///" + ProfileDirectory.LocalDataPath + "/" + Filename);
return new ImageBrush(new BitmapImage(result));
}
}这也适用于Visual Studio IDE。
发布于 2009-10-30 00:34:21
您可以将图像写入%APPDATA%的子文件夹,该文件夹是可写的。您可以使用Environment.SpecialFolder.ApplicationData获取路径
https://stackoverflow.com/questions/1644329
复制相似问题