1

我发现你可以序列化一个 wpf 组件,在我的例子中 a FixedDocument,使用XamlWriter和 a 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;

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

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

4

1 回答 1

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 的通用构造函数,而不是“特殊套管”每个需要以这种方式处理的对象。

于 2010-06-11T05:35:14.587 回答