Я переписал свой ответ на этот вопрос, потому что я нашел лучший способ напечатать набор FlowDocuments, показывая диалог печати только один раз. Ответ приходит из MacDonald, Pro WPF в C # 2008 (Apress 2008) в главе 20 на с. 704.
Мой код связывает набор объектов Note в IList с именем notesToPrint и получает FlowDocument для каждой заметки из класса DocumentServices в моем приложении. Он устанавливает границы FlowDocument в соответствии с принтером и устанавливает 1-дюймовое поле. Затем он печатает FlowDocument, используя свойство документа DocumentPaginator. Вот код:
// Show Print Dialog
var printDialog = new PrintDialog();
var userCanceled = (printDialog.ShowDialog() == false);
if(userCanceled) return;
// Print Notes
foreach(var note in notesToPrint)
{
// Get next FlowDocument
var collectionFolderPath = DataStore.CollectionFolderPath;
var noteDocument = DocumentServices.GetFlowDocument(note, collectionFolderPath) ;
// Set the FlowDocument boundaries to match the page
noteDocument.PageHeight = printDialog.PrintableAreaHeight;
noteDocument.PageWidth = printDialog.PrintableAreaWidth;
// Set margin to 1 inch
noteDocument.PagePadding = new Thickness(96);
// Get the FlowDocument's DocumentPaginator
var paginatorSource = (IDocumentPaginatorSource)noteDocument;
var paginator = paginatorSource.DocumentPaginator;
// Print the Document
printDialog.PrintDocument(paginator, "FS NoteMaster Document");
}
Это довольно простой подход с одним существенным ограничением: он не печатается асинхронно. Для этого вам нужно выполнить эту операцию в фоновом потоке, как я это делаю.