我正在为 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
显式实现(我尝试了这两个选项并且它们给出了所需的结果),但是如何做到这一点BitmapImage
呢?
作为最后的手段,我可以加载 XAML 文件并使用 Linq to XML 删除属性,但我希望有一个更干净的解决方案。