Pergunta

Existe alguma maneira para imprimir na coleta de memória ou tamanho variável no WPF?

Eu estou usando o seguinte código em que eu imprimir o controle ListView. Mas quando o conteúdo é maior do que a barra de rolagem vertical assume e corta o conteúdo.

 PrintDialog printDialog = new PrintDialog();
                printDialog.ShowDialog();

                printDialog.PrintVisual(lvDocumentSummary, "testing printing!");
Foi útil?

Solução

Para imprimir várias páginas você só precisa usar uma classe que implementa DocumentPaginator FixedDocument é uma das implementações mais complexas, FlowDocument é uma mais simples.

FlowDocument fd = new FlowDocument();

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

fd.Print();

ou

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

Outras dicas

FixedDocument suporta DataBinding (excepto FlowDocument) como qualquer outro documento XAML. apenas sediar a listview em um FixedDocument e exibi-lo em um DocumentViewer (que foi construído com suporte de impressão).

No entanto, se a sua lista é muito longa para uma página, FixedDocument não gera automaticamente uma nova página (como FlowDocument faz). portanto, você tem que criar uma nova página maually com código, pois isso não pode ser feito em XAML puro.

Se você quiser boa impressão a partir de WPF que você precisa para construir um FixedDocument e imprimir que, infelizmente, pode ser muito complexo, dependendo do que você está tentando imprimir.

Há algum código de exemplo que cria um FixedDocument aqui: http://www.ericsink.com /wpf3d/B_Printing.html

Aqui está uma resposta 2019. Algumas das respostas antigas não funcionam mais, por exemplo. não FlowDocumentReader não tem um método 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...");
        }
    }

Interessante, é o ListView virtualizado? Se for, o objeto não são desenhadas, que é uma possibilidade. Dê uma olhada na impressão exemplo de Petzold.

Aqui está a minha solução para este problema. É um bocado instável, mas funciona para o meu cenário.

Eu li minha coleção e transformá-lo em uma corda. A coleção inteira agora reside em um objeto StringBuilder. Em seguida, eu vi o texto / string em um arquivo na máquina do cliente e, em seguida, executar o processo de bloco de notas com / p para imprimir o conteúdo do arquivo.

Ele funciona e imprime o conteúdo com sucesso.

Finalmente, há um temporizador que é chamado depois de 5 segundos e que remove o arquivo. Basicamente dentro de 5 segundos o pedido já é enviado para a fila de impressão. Mas uma solução melhor será ter certeza de que o trabalho de impressão foi processado desta forma você vai ser 100% de certeza de que o trabalho foi realizado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top