【发布时间】:2014-01-25 02:36:13
【问题描述】:
我正在尝试从磁盘加载 XPS 文件并将其打印为我创建的内存文档中的 FixedDocument 或 FixedDocumentSequence 的一部分。它们需要作为一个序列打印,因为它们是双面打印的。
这是我迄今为止最好的尝试:
// create my memory FixedDocument (a packing slip)
DocumentReference mainDocRef = GetMainDoc(); // created in memory
// load XPS document from file (to print on the back)
XpsDocument xpsDoc = new XpsDocument("flyer.xps", FileAccess.Read);
var docSequenceFromFile = xpsDoc.GetFixedDocumentSequence();
var xpsDocRef = docSequenceFromFile.References.First();
// try to combine together
FixedDocumentSequence documentSequence = new FixedDocumentSequence();
documentSequence.References.Add(mainDocRef);
documentSequence.References.Add(xpsDocRef); // THROWS EXCEPTION
// print
XpsDocumentWriter xps = PrintQueue.CreateXpsDocumentWriter(printQueue);
xps.Write(documentSequence, ticket);
我总是以例外结束:
InvalidOperationException:附加信息:指定元素已经是另一个元素的逻辑子元素。先断开连接。
我已经尝试了几种方法来做到这一点,但总是以这样的错误结束
如何加载XpsDocument 并将其作为第二页打印在我在内存中创建的FixedDocumentSequence 中?
【问题讨论】:
-
WAG,但在引用的 FixedDocumentSequence 上调用 RemoveLogicalChild。这都是WPF,顺便说一句。在 WPF 中,元素最多有一个“逻辑父级”,就像拥有您在代码中使用的实例的对象一样(可视化树是从逻辑树创建的,并且可以不同)。要执行您想要的操作,您需要断开孩子与父母的连接,以便您可以将其重新连接到不同的父母。我认为我链接到的方法应该这样做。
-
@Will 这是一个受保护的方法
-
不仅受到保护,而且在内部
-
@Simon_Weaver:这就是为什么我说它是 WAG(疯狂的猜测)。但是,校长还是一样的。您必须断开孩子与父母的联系。时期。如果没有示例项目,我无法确定地告诉您如何做到这一点。您可以使用 LogicalTreeHelper 来查找父级,然后检查它以获取可用于断开两者的方法或属性。对于不同的框架类型,它是不同的。例如,要断开 ContentControl,只需将其 Content 属性清空即可。而且,嘿,更糟的是,利用反射偷偷躲在窗帘后面。
标签: .net xaml xps xpsdocument