4

我正在为 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 删除属性,但我希望有一个更干净的解决方案。

4

2 回答 2

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 时可以工作:)。好吧,我希望值得一试。

于 2011-07-04T04:29:48.853 回答
0

我最终通过使用 Linq to XML 手动生成 XAML 解决了这个问题。

于 2011-10-13T08:24:53.553 回答