我正在为WPF应用程序制作主题编辑器。我动态生成XAML文件,然后将它们编译成应用程序使用的DLL。用于生成XAML文件的代码如下:
var dictionary = new ResourceDictionary();
...
dictionary.Add(key, new BitmapImage { UriSource = new Uri(relativePath, UriKind.Relative) });
...
XamlWriter.Save(dictionary, "myDictionary.xaml");
我的问题是XamlWriter.Save
也序列化BaseUri
属性:
<BitmapImage BaseUri="{x:Null}" UriSource="Images\myImage.png" x:Key="myImage" />
结果是,当应用程序尝试获取此图像时,它找不到它,因为未设置BaseUri
。通常,XAML解析器设置此属性(通过IUriContext
接口),但是当它已在XAML中显式设置时,解析器不会设置它,因此它保持为空。
有没有办法阻止XamlWriter
序列化BaseUri
属性?
如果我正在序列化自定义类,我可以添加ShouldSerializeBaseUri()
方法,或明确实现IUriContext
(我尝试了两个选项并且它们会提供所需的结果),但如何为{ {1}}?
作为最后的手段,我可以加载XAML文件并使用Linq删除属性到XML,但我希望有一个更清晰的解决方案。
答案 0 :(得分:0)
如果不是阻止XamlWriter
编写BaseUri
属性,我们会给它一些不影响图像加载的内容,该怎么办?例如,以下代码:
<Image>
<Image.Source>
<BitmapImage UriSource="Resources/photo.JPG"/>
</Image.Source>
</Image>
似乎等同于
<Image>
<Image.Source>
<BitmapImage BaseUri="pack://application:,," UriSource="Resources/photo.JPG"/>
</Image.Source>
</Image>
尝试
dictionary.Add("Image", new BitmapImage{
BaseUri=new Uri("pack://application:,,"),
UriSource = new Uri(@"Images\myImage.png", UriKind.Relative)
});
如果您尝试将图像源设置为从代码中以这种方式创建的BitmapImage - 它将无法正常工作。但XamlWriter.Save()
生成的XAML在XAML :)时可以正常工作。嗯,值得我尝试。
答案 1 :(得分:0)
我最终通过使用Linq to XML手动生成XAML来解决问题。