我发现您可以使用FixedDocument
和XamlWriter
来序列化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组件?
答案 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,而不是每个需要以这种方式处理的对象的“特殊外壳”。