Показать несколько 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);
}
}
}