Frage

Gibt es eine Möglichkeit in Speichern Sammlung oder variabler Größe in WPF drucken?

Ich verwende den folgenden Code, in dem ich das Listview-Steuerelement drucken. Aber wenn der Gehalt größer als die vertikale Bildlaufleiste übernimmt und schneidet den Inhalt.

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

                printDialog.PrintVisual(lvDocumentSummary, "testing printing!");
War es hilfreich?

Lösung

Um mehrere Seiten drucken Sie brauchen nur eine Klasse zu verwenden, die DocumentPaginator FixedDocument ist eines der komplexeren Implementierungen implementiert, Flowdocument ist ein einfacheres.

FlowDocument fd = new FlowDocument();

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

fd.Print();

oder

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

Andere Tipps

FixedDocument unterstützt Databinding (außer Flowdocument) wie jedes andere XAML-Dokument. nur die Listenansicht in einem FixedDocument Gastgeber und in einem Documentviewer angezeigt werden (die Druckunterstützung in gebaut hat).

jedoch, wenn Ihre Liste für eine Seite zu lang ist, wird FixedDocument nicht automatisch eine neue Seite erzeugen (wie Flowdocument tut). deshalb müssen Sie maually mit Code, um eine neue Seite zu erstellen, da dies nicht in reiner XAML getan werden kann.

Wenn Sie schöne Druck von WPF möchten, benötigen Sie einen FixedDocument und Druck aufzubauen, die, leider kann es sehr komplex sein, je nachdem, was Sie versuchen, zu drucken.

Es gibt einige Beispiele-Code, der eine FixedDocument hier erstellt: http://www.ericsink.com /wpf3d/B_Printing.html

Hier ist eine 2019 Antwort. Einige der alten Antworten nicht mehr funktionieren, zum Beispiel. Flowdocumentreader keine Print Methode haben.

        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...");
        }
    }

Interessant ist die Listview virtualisiert? Wenn ja, wird das Objekt nicht gezeichnet, das ist eine Möglichkeit. Schauen Sie sich auf das Drucken Beispiel von Petzold.

Hier ist meine Lösung für dieses Problem. Es ist ein bisschen wackelig, aber funktioniert für mein Szenario.

ich meine Sammlung zu lesen und es in einen String umwandeln. Die gesamte Kollektion befindet sich jetzt in einem Stringbuilder-Objekt. Als nächstes sah ich den Text / string in eine Datei auf den Computer des Kunden und dann den Notizblock Prozess mit / p ausführen, um die Inhalte der Datei zu drucken.

Es funktioniert und es druckt die Inhalte erfolgreich.

Schließlich gibt es einen Timer, der nach 5 Sekunden und die entfernt die Datei aufgerufen wird. Im Wesentlichen innerhalb von 5 Sekunden wird die Anforderung bereits an die Drucker-Warteschlange gesendet. Aber eine bessere Lösung sein wird, um sicherzustellen, dass der Druckauftrag auf diese Weise bearbeitet wurde, erhalten Sie 100% sicher sein, dass der Auftrag ausgeführt wurde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top