Pregunta

¿Hay alguna forma de imprimir en 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!");
¿Fue útil?

Solución

Para imprimir varias páginas, solo necesita usar una clase que implementa DocumentPaginator FixedDocument es una de las implementaciones más complejas, FlowDocument es una 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);

Otros consejos

FixedDocument admite DataBinding (que no sea FlowDocument) como cualquier otro documento xaml. simplemente aloje la vista de lista en un documento fijo y muéstrela 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 lo hace flowdocument). por lo tanto, debe crear una nueva página manualmente con código, ya que esto no se puede hacer en xaml puro.

Si desea una buena impresión desde WPF, debe compilar un documento fijo e imprimirlo, desafortunadamente puede ser muy complejo dependiendo de lo que esté intentando imprimir.

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

Aquí hay una respuesta 2019. Algunas de las respuestas anteriores ya no funcionan, por ejemplo. FlowDocumentReader no tiene un método de Print .

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            FlowDocument fd = new FlowDocument();
            foreach (var item in COLLECTION) //<- put your collection here
            {
                fd.Blocks.Add(new Paragraph(new Run(item.ToString())));
            }

            PrintDialog pd = new PrintDialog();
            if (pd.ShowDialog() != true) return;

            fd.PageHeight = pd.PrintableAreaHeight;
            fd.PageWidth = pd.PrintableAreaWidth;

            IDocumentPaginatorSource idocument = fd as IDocumentPaginatorSource;

            pd.PrintDocument(idocument.DocumentPaginator, "Printing Flow Document...");
        }
    }

Interesante, ¿el ListView está virtualizado? Si es así, el objeto no se dibuja, eso es una posibilidad. Mire el ejemplo de Impresión de Petzold.

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

Leí mi colección y la transformé en una cadena. La colección completa ahora reside en un objeto StringBuilder. A continuación, vi el texto / cadena en un archivo en la máquina del cliente y luego ejecuté el proceso de 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 envía 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 ha realizado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top