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

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

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

myDocumentViewer.Document = myFixedDocument;

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

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

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


person Ross    schedule 29.04.2011    source источник


Ответы (2)


Догадаться.

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

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

Я не совсем понимаю, как я пропустил метод SetDocument раньше. Я думаю, что я, должно быть, искал свойство DocumentReference.Document с геттером/сеттером. На мой взгляд, использование методов GetDocument и SetDocument в среде .NET немного несовместимо.

person Ross    schedule 03.05.2011

Вы пытались это сделать, я попытался реализовать ваш 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);
                            }
                        }
                    }
person Rohit Vats    schedule 29.04.2011
comment
Спасибо - я нашел другой способ (см. мой ответ), поэтому не смог проверить ваше решение. Я пробовал что-то подобное, но получал ошибки о страницах, уже принадлежащих другому документу, и это не разрешалось. Но ваш подход немного отличается, так что вполне может сработать! - person Ross; 03.05.2011