Domanda

Esiste un modo per stampare nella raccolta di memoria o dimensioni variabili in WPF?

Sto usando il seguente codice in cui stampo il controllo ListView. Ma quando il contenuto è più grande della barra di scorrimento verticale prende il sopravvento e ne taglia il contenuto.

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

                printDialog.PrintVisual(lvDocumentSummary, "testing printing!");
È stato utile?

Soluzione

Per stampare più pagine devi solo usare una classe che implementa DocumentPaginator FixedDocument è una delle implementazioni più complesse, FlowDocument è una più semplice.

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);

Altri suggerimenti

FixedDocument supporta DataBinding (diverso da FlowDocument) come qualsiasi altro documento xaml. è sufficiente ospitare la visualizzazione elenco in un documento fisso e visualizzarlo in un DocumentViewer (che ha il supporto di stampa integrato).

tuttavia, se l'elenco è troppo lungo per una pagina, FixedDocument non genera automaticamente una nuova pagina (come fa flowdocument). quindi devi creare una nuova pagina manualmente con il codice, poiché ciò non può essere fatto in puro xaml.

Se vuoi una buona stampa da WPF devi costruire un FixedDocument e stamparlo, sfortunatamente può essere molto complesso a seconda di cosa stai cercando di stampare.

C'è un codice di esempio che crea un FixedDocument qui: http://www.ericsink.com /wpf3d/B_Printing.html

Ecco una risposta per il 2019. Alcune delle vecchie risposte non funzionano più, ad es. FlowDocumentReader non ha un metodo Stampa .

        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, ListView è virtualizzato? Se lo è, l'oggetto non viene disegnato, questa è una possibilità. Dai un'occhiata al esempio di Petzold.

Ecco la mia soluzione a questo problema. È un po 'traballante ma funziona per il mio scenario.

Ho letto la mia collezione e la trasformo in una stringa. L'intera raccolta ora risiede in un oggetto StringBuilder. Successivamente, ho visto il testo / la stringa in un file sulla macchina del client e quindi ho eseguito il processo di blocco note con / p per stampare il contenuto del file.

Funziona e stampa i contenuti con successo.

Infine, c'è un timer che viene chiamato dopo 5 secondi e che rimuove il file. Fondamentalmente entro 5 secondi la richiesta è già inviata alla coda di stampa. Ma una soluzione migliore sarà quella di assicurarsi che il lavoro di stampa sia stato elaborato in questo modo sarai sicuro al 100% che il lavoro sia stato eseguito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top