2010-08-28 25 views
6

Estoy escribiendo una aplicación para tomar notas en WPF, usando un FlowDocument para cada nota individual. La aplicación busca y filtra notas por etiquetas. Quiero imprimir todas las notas en la lista filtrada actual como documentos separados, y solo quiero mostrar un solo Diálogo de impresión al comienzo del trabajo.WPF: Impresión de FlowDocument sin diálogo de impresión

He encontrado un buen ejemplo de impresión in this thread, pero está orientado a imprimir una sola FlowDocument, por lo que utiliza una sobrecarga de CreateXpsDocumentWriter() que muestra un diálogo de impresión.

Así que, aquí está mi pregunta: ¿Alguien puede sugerir un buen código para imprimir un FlowDocument sin mostrar un PrintDialog? Me imagino que mostraré el cuadro de diálogo Imprimir al comienzo del procedimiento y luego recorreré mi colección de notas para imprimir cada FlowDocument.

Respuesta

3

He reescrito mi respuesta a esta pregunta, porque encontré una mejor manera de imprimir un conjunto de FlowDocuments, mientras mostraba el cuadro de diálogo Imprimir una sola vez. La respuesta proviene de MacDonald, Pro WPF en C# 2008 (Apress 2008) en el Capítulo 20 en p. 704.

Mi código agrupa un conjunto de objetos Note en un IList llamado notesToPrint y obtiene el FlowDocument para cada Note de una clase DocumentServices en mi aplicación. Establece los límites de FlowDocument para que coincidan con la impresora y establece un margen de 1 pulgada. Luego imprime FlowDocument, usando la propiedad DocumentPaginator del documento. Aquí está el código:

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

Este es un enfoque bastante simple, con una limitación importante: no se imprime de forma asíncrona. Para hacer eso, tendrías que realizar esta operación en un hilo de fondo, que es como lo hago.

+0

Todavía me gustaría encontrar una mejor manera de hacerlo. Si alguien puede sugerir uno, cambiaré la respuesta aceptada. –

+3

Puede intentar usar los miembros PrintDialog.PrintQueue e PrintDialog.PrintTicket. Con PrintQueue puede crear un XpsDocumentWriter, luego puede usar WriteAsync() para imprimir de forma asincrónica. Guardar en caché la cola y el ticket parece ser mejor que almacenar en caché el PrintDialog. –

+0

Gracias, eso es útil. +1 de mi parte –

1

Solo un ciclo después de obtener el printDialog.

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