【问题标题】:Show several FixedDocuments in a DocumentViewer, as if they were a single document在 DocumentViewer 中显示多个 FixedDocument,就像它们是单个文档一样
【发布时间】:2011-05-03 18:21:39
【问题描述】:

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

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

myDocumentViewer.Document = myFixedDocument;

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

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

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

【问题讨论】:

    标签: .net wpf documentviewer fixeddocument fixeddocumentsequence


    【解决方案1】:

    想通了。

    实际上,您可以动态创建链接到 FixedDocumentsDocumentReference 对象:

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

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

    【讨论】:

      【解决方案2】:

      您是否尝试过这样做,我已尝试实施您的第一种方法。我希望这对你有用 -

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

      【讨论】:

      • 谢谢 - 我找到了另一种方法(请参阅我的答案),因此无法测试您的解决方案。我曾尝试过类似的事情,但我收到了关于已经属于另一个文档的页面的错误,并且它不允许这样做。但是你的方法有点不同,所以它可能会奏效!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-10
      • 1970-01-01
      • 2012-08-04
      相关资源
      最近更新 更多