wpf printing printdialog

Imprimir una colección en WPF



printing printdialog (5)

¿Hay alguna manera de imprimir en la colección de memoria o tamaño variable en WPF?

Estoy usando el siguiente código en el que imprimo el control ListView. Pero cuando el contenido es más grande que la barra de desplazamiento vertical toma el control y corta el contenido.

PrintDialog printDialog = new PrintDialog(); printDialog.ShowDialog(); printDialog.PrintVisual(lvDocumentSummary, "testing printing!");


FixedDocument admite DataBinding (que no sea FlowDocument) como cualquier otro documento xaml. simplemente aloje la vista de lista en un documento fijo y visualícela en un DocumentViewer (que tiene soporte de impresión incorporado).

sin embargo, si su lista es demasiado larga para una página, FixedDocument no genera automáticamente una página nueva (como flowdocument). por lo tanto, debe crear una nueva página manualmente con código, ya que esto no se puede hacer en xaml puro.


Interesante, ¿está el ListView virtualizado? Si lo es, el objeto no se dibuja, eso es una posibilidad. Eche un vistazo al ejemplo de impresión de Petzold.


Aquí está mi solución a este problema. Es un poco inestable pero funciona para mi escenario.

Leo mi colección y la transformo en una cadena. Toda la colección ahora reside en un objeto StringBuilder. Luego, vi el texto / cadena en un archivo en la máquina del cliente y luego ejecuté el proceso del bloc de notas con / p para imprimir el contenido del archivo.

Funciona e imprime los contenidos con éxito.

Finalmente, hay un temporizador al que se llama después de 5 segundos y que elimina el archivo. Básicamente, en 5 segundos, la solicitud ya se envió a la cola de la impresora. Pero una mejor solución será asegurarse de que el trabajo de impresión se haya procesado de esta manera, estará 100% seguro de que el trabajo se haya realizado.


Si quieres una buena impresión de WPF, necesitas construir un FixedDocument e imprimirlo, desafortunadamente puede ser muy complejo dependiendo de lo que estés tratando de imprimir.

Hay un código de ejemplo que crea un FixedDocument aquí: http://www.ericsink.com/wpf3d/B_Printing.html


Para imprimir varias páginas solo necesita usar una clase que implemente DocumentPaginator FixedDocument es una de las implementaciones más complejas, FlowDocument es más simple.

FlowDocument fd = new FlowDocument(); foreach(object item in items) { fd.Blocks.Add(new Paragraph(new Run(item.ToString()))); } fd.Print();

o

PrintDialog pd = new PrintDialog(); pd.PrintDocument(fd);