2008-10-15 5 views
2

Existe-t-il un moyen d'imprimer dans la collection de mémoire ou la taille variable dans WPF?Impression d'une collection 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 prend le dessus et coupe le contenu.

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

       printDialog.PrintVisual(lvDocumentSummary, "testing printing!"); 

Répondre

6

Pour imprimer plusieurs pages il 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); 
-1

Intéressant, la ListView est-elle virtualisée? Si c'est le cas, les objets ne sont pas dessinés, c'est une possibilité. Jetez un oeil à l'impression example de Petzold.

+1

J'ai vérifié cet exemple, mais il utilise des fichiers à imprimer. J'ai une collection en mémoire à imprimer! – azamsharp

+0

Le lien Petzold n'est plus présent –

-4

Voici ma solution à ce problème. C'est un peu fragile mais ça marche pour mon scénario. Je lis ma collection et la transforme en une chaîne de caractères. La collection entière réside maintenant dans un objet StringBuilder. Ensuite, j'ai vu le texte/chaîne dans un fichier sur la machine du client, puis exécutez le processus du bloc-notes avec/p pour imprimer le contenu du fichier.

Cela fonctionne et il imprime le contenu avec succès. Enfin, il y a une minuterie qui est appelée après 5 secondes et qui supprime le fichier. Fondamentalement, dans les 5 secondes, la demande est déjà envoyée à la file d'attente de l'imprimante. Mais une meilleure solution sera de s'assurer que le travail d'impression a été traité de cette façon, vous serez sûr à 100% que le travail a été effectué.

+2

Appel d'application externe pour imprimer des éléments, avec conditions de concurrence? En aucune façon! Et de penser que vous utilisez un site Web de base de connaissances de développement! Trucs effrayants. –

+0

Vous pouvez facilement y parvenir en utilisant FlowDocument And FixedDocuments! – azamsharp

+0

C'est une très mauvaise façon de faire cela, vous seulement un FlowDocument avec un BlockUIContainer. Si c'est une liste particulièrement longue, utilisez un FixedDocument. – Echilon

0

Si vous souhaitez une impression agréable à partir de 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.

Il y a quelques exemples de code qui crée un FixedDocument ici: http://www.ericsink.com/wpf3d/B_Printing.html

2

FixedDocument soutient DataBinding (autres que FlowDocument) comme tout autre document XAML. hébergez simplement la listview dans un document fixe et affichez-la dans un DocumentViewer (qui a un support d'impression intégré). Toutefois, si votre liste est trop longue pour une page, FixedDocument ne génère pas automatiquement une nouvelle page (comme le fait flowdocument). par conséquent, vous devez créer une nouvelle page maually avec du code, car cela ne peut pas être fait en xaml pur.

Questions connexes