2010-08-28 32 views
6

Ich schreibe eine Notizanwendung in WPF, unter Verwendung einer FlowDocument für jede einzelne Notiz. Die App sucht und filtert Notizen nach Tags. Ich möchte alle Notizen in der aktuellen gefilterten Liste als separate Dokumente drucken, und ich möchte nur einen einzigen Druckdialog am Anfang des Jobs anzeigen.WPF: Drucken von FlowDocument ohne Druckdialog

Ich fand ein gutes Druckbeispiel in this thread, aber es ist darauf ausgerichtet, eine einzige FlowDocument zu drucken, so dass es eine CreateXpsDocumentWriter() Überladung verwendet, die einen Druckdialog anzeigt.

Also, hier ist meine Frage: Kann jemand empfehlen, einen guten Code zum Drucken einer FlowDocument ohne Anzeige einer PrintDialog? Ich denke, ich werde den Druckdialog am Anfang der Prozedur anzeigen und dann durch meine Notizen Sammlung gehen, um jedes FlowDocument zu drucken.

Antwort

3

Ich habe meine Antwort auf diese Frage neu geschrieben, weil ich einen besseren Weg gefunden habe, eine Reihe von FlowDocuments zu drucken, während der Druckdialog nur einmal angezeigt wird. Die Antwort kommt von MacDonald, Pro WPF in C# 2008 (Apress 2008) in Kapitel 20 bei p. 704.

Mein Code bündelt eine Reihe von Notizobjekten in einer IList namens notesToPrint und ruft das FlowDocument für jede Notiz aus einer DocumentServices-Klasse in meiner App ab. Er legt die FlowDocument-Grenzen so fest, dass sie dem Drucker entsprechen, und legt einen Rand von 1 Zoll fest. Anschließend wird das FlowDocument unter Verwendung der DocumentPaginator-Eigenschaft des Dokuments gedruckt. Hier ist der Code:

// 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"); 
} 

Das ist ein ziemlich einfacher Ansatz, mit einer erheblichen Einschränkung: Es ist nicht asynchron drucken. Um dies zu tun, müssten Sie diese Operation in einem Hintergrund-Thread durchführen, so wie ich es tue.

+0

Ich möchte immer noch einen besseren Weg finden, dies zu tun. Wenn jemand einen vorschlagen kann, ändere ich die angenommene Antwort. –

+3

Sie können versuchen, die Mitglieder PrintDialog.PrintQueue und PrintDialog.PrintTicket zu verwenden. Mit der PrintQueue können Sie einen XpsDocumentWriter erstellen, dann können Sie WriteAsync() verwenden, um asynchron zu drucken. Zwischenspeichern der Warteschlange und Ticket scheint besser als Caching der PrintDialog. –

+0

Danke - das ist hilfreich. +1 von mir. –

1

Nur eine Schleife, nachdem Sie die printDialog haben.

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