Показать несколько исправленных документов в DocumentViewer, как если бы они были одним документом

#.net #wpf #documentviewer #fixeddocument #fixeddocumentsequence

#.net #wpf #documentviewer #исправленный документ #исправленная последовательность документов

Вопрос:

В моем приложении WPF у меня есть несколько объектов FixedDocument, которые я хочу отобразить вместе в DocumentViewer, как если бы они были одним документом.

В средстве просмотра документов легко отобразить один исправленный документ:

 myDocumentViewer.Document = myFixedDocument;
  

Моей первой идеей было создать последовательность фиксированных документов из всех моих фиксированных документов (которые также можно задать как DocumentViewer. Значение документа, поскольку оно реализует IDocumentPaginatorSource). Но при создании FixedDocumentSequence можно добавлять только в коллекцию объектов DocumentReference. Не существует простого способа добавить исправленный документ напрямую, и я не могу понять, как создать и добавить DocumentReference, который каким-то образом связан с одним из моих исправленных документов.

Моей второй идеей было создать главный исправленный документ, а затем перебирать все исправленные документы и перемещать их страницы в главный исправленный документ. Но я сталкиваюсь со всевозможными проблемами при попытке сделать это (для страниц, уже принадлежащих другому документу (без возможности удалить их из этого документа! и т.д. и т.п.)

Моей третьей идеей было создать временный XpsDocument и извлечь FixedDocumentSequence, который, по-видимому, создается автоматически. Я немного посмотрел на это, но это становится излишне сложным, поэтому я подумал, что сначала опубликую здесь, чтобы посмотреть, есть ли какие-либо другие идеи или помочь с моими первыми двумя попытками!

Ответ №1:

Разобрался.

На самом деле вы можете динамически создавать объекты DocumentReference, связанные с фиксированными документами:

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

Я не совсем уверен, как я пропустил SetDocument метод раньше. Я думаю, что я, должно быть, искал DocumentReference.Document свойство с помощью getter / setter. Это немного непоследовательно в .На мой взгляд, NET framework вместо этого использует методы getDocument и setDocument.

Ответ №2:

Вы пробовали это делать, я пробовал реализовать ваш первый подход. Я надеюсь, что это подойдет для вас —

 FixedDocument destFixedDoc = new FixedDocument();
    foreach (FixedDocument sourceFixedDoc in YourCollection)
                    {
                        if ((sourceFixedDoc != null) amp;amp; (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);
                            }
                        }
                    }
  

Комментарии:

1. Спасибо — я нашел другой способ (см. Мой ответ), и поэтому не смог протестировать ваше решение. Я пробовал что-то подобное, но я получал ошибки о страницах, уже принадлежащих другому документу, и это не позволяло этого. Но ваш подход немного отличается, так что он вполне может сработать!