如何防止XamlWriter.Save序列化BaseUri属性?

时间:2011-06-27 15:30:35

标签: .net wpf xaml serialization xamlwriter

我正在为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,但我希望有一个更清晰的解决方案。

2 个答案:

答案 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来解决问题。