Как предотвратить XamlWriter.Save от сериализации свойства BaseUri? - PullRequest
4 голосов
/ 27 июня 2011

Я делаю редактор тем для приложения 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 в XML, но я надеялся на более чистое решение.

Ответы [ 2 ]

0 голосов
/ 13 октября 2011

Я в конце концов решил проблему, сгенерировав XAML вручную с Linq to XML.

0 голосов
/ 04 июля 2011

Что если вместо того, чтобы 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 :).Надеюсь, стоит попробовать.

...