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