2010-08-28 2 views
6

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

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

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

ответ

3

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

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

+0

Я все еще хотел бы найти лучший способ сделать это. Если кто-нибудь может предложить его, я изменю принятый ответ. –

+3

Вы можете попробовать использовать элементы PrintDialog.PrintQueue и PrintDialog.PrintTicket. С помощью PrintQueue вы можете создать XpsDocumentWriter, тогда вы можете использовать WriteAsync() для печати асинхронно. Кэширование очереди и билета кажется лучше кэширования PrintDialog. –

+0

Спасибо, это полезно. +1 от меня. –

1

Только петля после того, как вы получили printDialog.

for(int i=0 i<document.count i++) 
    printdocument((document[i] as iDocumentPaginator),"title"+[i]); 
Смежные вопросы