2011-12-21 3 views
3

Мое приложение генерирует файлы XAML из объектов в памяти с использованием встроенного .NET-решения: System.XamlServices.Save(Stream, Object) Однако XAML, который я получаю, плохо загрязнен. Все свойства всегда сериализованы. Есть ли способ сообщить сериализатору XAML игнорировать свойства, которые имеют значения по умолчанию? (У меня почти полный контроль над классами, которые сериализованы.)Тональная обработка XAML-сериализации графа объектов

Expression Blend отлично справляется с этим: если мы не изменим свойство, сгенерированный файл XAML его вообще не будет содержать. Приведенный XAML не загроможден всеми возможными свойствами и их значениями по умолчанию и не похож на обычный автогенерированный беспорядок. Я тоже хотел бы иметь красивый XAML.

ответ

1

Чтобы сделать это с помощью всего одного объекта:

После:

  • Создайте новый объект со свойствами по умолчанию
  • сериализовать его XAML
  • загрузить его в XML DOM
  • Перезапуск через каждого дочернего узла и дочернего узла
  • Сохраните каждый в словаре с ключом XPath узла, значение innerXML. Очевидно, что если у вас есть узлы с одним и тем же путем, это не сработает, вам придется их квалифицировать. Но в таком случае вы, вероятно, никогда не захотите обрезать их.
  • Вам больше не нужен этот объект. Поднимите его, держите словарь вокруг.

Для каждого объекта:

  • Serialize этого объект XAML
  • Loadit в XML DOM
  • Recurse через каждый ребенок и к югу от дочернего узла
  • Посмотрите каждый XPath в Словарь.
  • Если innerXML тот же, обратите внимание на это в списке узлов, которые следует бояться.
  • Когда закончите рекурсию, покажите те узлы, почему они боятся - УДАЛИТЕ их!
  • DOM должен иметь красивый XAML в нем.

У меня был один и тот же XPath в словаре, чтобы сделать вложенные объекты лучше. Тем не менее, это зависит от ваших объектов и того, как они вложены для меня. удачи!

3

Старый вопрос, но у меня также была эта проблема в последнее время, и похоже, что сериализатор Xaml уважает DefaultValueAttribute.

Я действительно не тестировал это в любой версии, но .net 4.5, но я помню, что читал об этом в статье от 2006 года (что я не могу сейчас найти несчастливо)

Две другие атрибуты, чтобы искать для получения более чистого XAML является ContentAttribute , что позволяет perticular свойство быть «по умолчанию» когда другие элементы указаны как прямые дочерние элементы этого элемента и ContentWrapperAttribute, что позволяет указать, какой тип использовать для обертывания этих значений (для коллекций)