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

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

Легко отобразить один FixedDocument в средстве просмотра документов:

myDocumentViewer.Document = myFixedDocument;

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

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

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

2 ответа

Решение

Догадаться.

Фактически вы можете динамически создавать объекты DocumentReference, связанные с FixedDocuments:

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

Я не совсем уверен, как я пропустил SetDocument метод до. Я думаю, что я искал 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);
                            }
                        }
                    }
Другие вопросы по тегам