在DocumentViewer中显示几个FixedDocuments,就好像它们是单个文档一样

时间:2011-04-29 11:50:26

标签: .net wpf documentviewer fixeddocument fixeddocumentsequence

在我的WPF应用程序中,我有几个 FixedDocument 对象,我想在 DocumentViewer 中一​​起显示,就像它们是单个文档一样。

在文档查看器中显示单个 FixedDocument 很容易:

myDocumentViewer.Document = myFixedDocument;

我的第一个想法是创建所有 FixedDocuments FixedDocumentSequence (也可以将其设置为 DocumentViewer.Document 值,因为它实现 IDocumentPaginatorSource )。但是在构建 FixedDocumentSequence 时,只能添加到 DocumentReference 对象的集合中。没有直接的方法来直接添加 FixedDocument ,我无法弄清楚如何创建和添加 DocumentReference ,它以某种方式链接到我的之一FixedDocuments

我的第二个想法是创建一个主 FixedDocument ,然后遍历所有 FixedDocuments ,并将他们的页面移动到主 FixedDocument 。但是在尝试这样做时遇到了各种各样的问题(与已经属于另一个文档的页面有关(无法从该文档中删除它们等等)。

我的第三个想法是创建和构建一个临时的 XpsDocument ,并检索它自动似乎创建的 FixedDocumentSequence 。我已经看过这个了,但它会变得不必要复杂,所以我想我先在这里发帖,看看是否还有其他想法,或者帮助我前两次尝试!

2 个答案:

答案 0 :(得分:2)

想出来。

事实上,您可以动态创建链接到 FixedDocuments DocumentReference 对象:

var documentReference = new DocumentReference();
documentReference.SetDocument(document);
fixedDocumentSequence.References.Add(documentReference);

我不太确定我之前是如何错过SetDocument方法的。我想我一定在寻找带有getter / setter的DocumentReference.Document属性。在我看来,在.NET框架中有一点点不一致,而是使用 GetDocument SetDocument 方法。

答案 1 :(得分:1)

您是否尝试过这样做,我尝试过实施您的第一种方法。我希望这能为你做到 -

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);
                            }
                        }
                    }