WPF: печать FlowDocument без диалогового окна печати - PullRequest
6 голосов
/ 29 августа 2010

Я пишу приложение для создания заметок в WPF, используя FlowDocument для каждой отдельной заметки. Приложение ищет и фильтрует заметки по тегам. Я хочу напечатать все заметки в текущем отфильтрованном списке как отдельные документы, и я хочу показать только один диалог печати в начале работы.

Я нашел хороший пример печати в этой теме , но он ориентирован на печать одного FlowDocument, поэтому он использует перегрузку CreateXpsDocumentWriter(), которая отображает диалог печати.

Итак, вот мой вопрос: может кто-нибудь предложить какой-нибудь хороший код для печати FlowDocument без отображения PrintDialog? Я полагаю, что в начале процедуры я выведу на экран диалоговое окно «Печать», а затем переберу всю коллекцию заметок для печати каждого FlowDocument.

Ответы [ 2 ]

3 голосов
/ 29 августа 2010

Я переписал свой ответ на этот вопрос, потому что я нашел лучший способ напечатать набор 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");
}

Это довольно простой подход с одним существенным ограничением: он не печатается асинхронно. Для этого вам нужно выполнить эту операцию в фоновом потоке, как я это делаю.

1 голос
/ 20 сентября 2010

Просто цикл после того, как вы получили printDialog.

for(int i=0 i<document.count i++)
    printdocument((document[i] as iDocumentPaginator),"title"+[i]);
...