在我的WPF应用程序中,我有几个FixedDocument对象,我想把它们一起显示在DocumentViewer中,就好像它们是一个文档一样。
在文档查看器中显示单个FixedDocument很容易:
myDocumentViewer.Document = myFixedDocument;
我的第一个想法是创建一个FixedDocumentSequence我所有的FixedDocuments(也可以设置为DocumentViewer)。文档值,因为它实现IDocumentPaginatorSource)。但是当构建FixedDocumentSequence时,只能添加到DocumentReference对象集合中。没有直接添加FixedDocument的直接方法,我不知道如何创建和添加DocumentReference,它以某种方式链接到我的FixedDocuments。
我的第二个想法是创建一个主FixedDocument,然后循环遍历所有的FixedDocuments,并将它们的页面移动到主FixedDocument。但我遇到了各种各样的问题,当试图这样做(做与页面已经属于另一个文档(没有能力从该文档中删除它们!等等。)我的第三个想法是创建并构建一个临时的XpsDocument,并检索它自动创建的FixedDocumentSequence。我已经对此进行了一些研究,但它变得越来越复杂,所以我想我应该先在这里发布,看看是否有其他的想法,或者对我的前两次尝试有所帮助!我明白了
事实上,你可以动态地创建DocumentReference对象链接到FixedDocuments:
var documentReference = new DocumentReference();
documentReference.SetDocument(document);
fixedDocumentSequence.References.Add(documentReference);
我不太确定我之前怎么错过了SetDocument
方法。我想我一定是在寻找一个带有getter/setter的DocumentReference.Document
属性。在我看来,在。net框架中使用GetDocument和SetDocument方法是有点不一致的。
你试过这样做吗,我试过实现你的第一种方法。我希望这对你有用-
FixedDocument destFixedDoc = new FixedDocument();
foreach (FixedDocument sourceFixedDoc in YourCollection)
{
if ((sourceFixedDoc != null) && (sourceFixedDoc.Pages != null))
{
foreach (PageContent sourcePage in sourceFixedDoc.Pages)
{
PageContent newPage = new PageContent();
newPage.Source = sourcePage.Source;
(newPage as IUriContext).BaseUri = ((IUriContext)sourcePage).BaseUri;
newPage.GetPageRoot(true);
destFixedDoc.Pages.Add(newPage);
}
}
}