使用XamlWriter序列化WPF组件而不使用默认构造函数

时间:2010-06-10 16:53:32

标签: wpf serialization memorystream xamlreader documentpage

我发现您可以使用FixedDocumentXamlWriter来序列化wpf组件,在我的示例中为MemoryStream

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

然后把它拿回来:

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

但是,现在我需要能够序列化DocumentPage。缺少一个使XamlReader.Load调用抛出异常的默认构造函数。

有没有办法在没有默认构造函数的情况下序列化wpf组件?

1 个答案:

答案 0 :(得分:1)

这是一种技术。

首先创建一个可以构造所需类的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中的地方。

另请注意,可以创建一个通用构造函数调用MarkupExtension,而不是每个需要以这种方式处理的对象的“特殊外壳”。