Сериализация WPF-компонента с использованием XamlWriter без конструктора по умолчанию - PullRequest
1 голос
/ 10 июня 2010

Я обнаружил, что вы можете сериализовать компонент wpf, в моем примере FixedDocument, используя XamlWriter и MemoryStream:

FixedDocument doc = GetDocument();
MemoryStream stream = new MemoryStream();
XamlWriter.Save(doc, stream);

И затем вернуть его:1007 *

stream.Seek(0, SeekOrigin.Begin);
FixedDocument result = (FixedDocument)XamlReader.Load(stream);
return result;

Однако теперь мне нужно иметь возможность сериализовать DocumentPage.В котором отсутствует конструктор по умолчанию, из-за которого вызов XamlReader.Load вызывает исключение.

Есть ли способ сериализации компонента wpf без конструктора по умолчанию?

1 Ответ

1 голос
/ 11 июня 2010

Вот один из методов.

Сначала создайте MarkupExtension, которое может создать требуемый класс.Супер-простым было бы:

public class DocumentPageExtension : MarkupExtension
{
  public Visual Visual { get; set; }
  public Size PageSize { get; set; }
  public Rect BleedBox { get; set; }
  public Rect ContentBox { get; set; }

  public override object ProvideValue(IServiceProvider serviceProvider)
  {
    return new DocumentPage(Visual, PageSize, BleedBox, ContentBox);
  }
}

Теперь, после того как XamlWriter напишет ваш документ, просто замените «DocumentPage» на «my: DocumentPageExtension», добавив соответствующее объявление пространства имен в верхней части файла.

Полученный файл должен быть доступен для чтения по XamlReader.Load.

Возможно, XamlWriter не хранит значения свойств, доступных только для чтения, например, найденных в DocumentPage.(Я почти всегда использую замену XamlWriter, которую я написал некоторое время назад.) Если он вообще не сериализует эти свойства, приведенную здесь методику необходимо будет дополнить каким-либо другим способом получения этих значений свойств в XAML в первомplace.

Также обратите внимание, что общий вызывающий конструктор MarkupExtension может быть создан вместо «специального кожуха» для каждого объекта, который требует обработки таким способом.

...