Question

Existe-t-il un moyen d'imprimer dans une collection de mémoire ou une taille variable dans WPF?

J'utilise le code suivant dans lequel j'imprime le contrôle ListView. Mais lorsque le contenu est plus grand que la barre de défilement verticale, il prend la relève et coupe le contenu.

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

                printDialog.PrintVisual(lvDocumentSummary, "testing printing!");
Était-ce utile?

La solution

Pour imprimer plusieurs pages, il vous suffit d'utiliser une classe qui implémente DocumentPaginator. FixedDocument est l'une des implémentations les plus complexes, FlowDocument est plus simple.

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

Autres conseils

FixedDocument supporte DataBinding (autre que FlowDocument) comme tout autre document xaml. hébergez simplement la liste dans un document fixe et affichez-la dans un DocumentViewer (qui prend en charge l’impression intégrée).

Cependant, si votre liste est trop longue pour une page, FixedDocument ne génère pas automatiquement une nouvelle page (contrairement à flowdocument). vous devez donc créer une nouvelle page avec du code, car cela ne peut pas être fait en xaml pur.

Si vous voulez une bonne impression depuis WPF, vous devez créer un document FixedDocument et l’imprimer. Malheureusement, cela peut être très complexe en fonction de ce que vous essayez d’imprimer.

Un exemple de code créant un FixedDocument est ici: http://www.ericsink.com /wpf3d/B_Printing.html

Voici une réponse pour 2019. Certaines des anciennes réponses ne fonctionnent plus, par exemple. FlowDocumentReader n'a pas de méthode 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...");
        }
    }

Intéressant, le ListView est-il virtualisé? Si c'est le cas, les objets ne sont pas dessinés, c'est une possibilité. Jetez un coup d’œil à l’ exemple d’impression de Petzold.

Voici ma solution à ce problème. C'est un peu fragile mais ça fonctionne pour mon scénario.

Je lis ma collection et la transforme en chaîne. L'ensemble de la collection réside maintenant dans un objet StringBuilder. Ensuite, j'ai vu le texte / chaîne dans un fichier sur la machine du client, puis j'ai exécuté le processus de bloc-notes avec / p pour imprimer le contenu du fichier.

Cela fonctionne et affiche le contenu avec succès.

Enfin, il existe une minuterie appelée après 5 secondes qui supprime le fichier. En gros, dans les 5 secondes, la demande est déjà envoyée à la file d’imprimante. Cependant, une meilleure solution consiste à vous assurer que le travail d'impression a été traité de cette manière, vous serez ainsi sûr à 100% que le travail a été effectué.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top