Hey Leute,
ich sitz seit 3 Tagen an einem Problem bei dem mir langsam aber sicher die Ideen ausgehen. Ich habe mehrere WPF-Visuals die ich in einer XPS speichern möchte. Das erste Blatt soll eine Art Übersicht auf A3-hoch werden, dann sollen die Daten in einem DataGrid auf A4-quer gespeichert werden. Da findet man ja genug Ansätze bei Google. Ich hab mich dann für das FixedDocument entschieden. Dort erstelle ich mehrere Visuals, wrappe die in einer FixedPage mit der richtigen Größe und Ausrichtung, füge sie dem FixedDocument hinzu und speicher letztendlich das FixedDocument mit Hilfe des XpsDocumentWriters.
Alles schön und gut, sieht auch super aus. Das Problem ist jetzt, das mein Programm bei sehr vielen Seiten über 3GB RAM verbraucht, weil ja alle Visuals des FixedDocuments doppelt und dreifach im Speicher gehalten werden müssen. Also hab ich nach einer Möglichkeit gesucht die Elemente direkt nach dem Erstellen zu schreiben und danach gleich wieder freizugeben. Dieses Problem soll man mit dem SerializerWriterCollator lösen können. Das funktioniert auch relativ gut. Nur leider sind jetzt alle Seiten in der XPS gleich groß, obwohl ich bei jedem Schreibvorgang einen extra PrintTicket angegeben habe, welches die Seitengröße beinhaltet. So sieht das Ganze aus:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47:
| var printTicket = new PrintTicket() { OutputQuality = OutputQuality.High, PageMediaSize = new PageMediaSize(graphPrintContainer.ActualWidth, graphPrintContainer.ActualHeight), PageMediaType = PageMediaType.Archival, DeviceFontSubstitution = DeviceFontSubstitution.On, TrueTypeFontMode = TrueTypeFontMode.Automatic, PageOrientation = (graphPrintContainer.PageOrientation == PageOrientation.Landscape ? System.Printing.PageOrientation.Landscape : System.Printing.PageOrientation.Portrait), };
XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(xps); SerializerWriterCollator collator = writer.CreateVisualsCollator(printTicket, printTicket); collator.BeginBatchWrite(); try{ do { var pagePos = PageGenerator.GetPagePos(pageCount, pageIndex); graphContainer.GraphVisual.Translation = new Point(pagePos.X * pageSize.Width, pagePos.Y * pageSize.Height);
graphPrintContainer.UpdateLayout(); graphContainer.UpdatePrintAnnotationBehavior(); graphPrintContainer.UpdateLayout();
collator.Write(graphPrintContainer, printTicket); pageIndex++; } while (pageIndex < maxPages);
printTicket.PageMediaSize = new PageMediaSize(nodeOverviewPrintContainer.ActualWidth, nodeOverviewPrintContainer.ActualHeight); printTicket.PageOrientation = (nodeOverviewPrintContainer.PageOrientation == PageOrientation.Landscape ? System.Printing.PageOrientation.Landscape : System.Printing.PageOrientation.Portrait); for(int i = 0; i < nodeOverviewPages.Length; i++) { nodeOverviewDataGrid.SetPage(nodeOverviewPages[i]); nodeOverviewDataGrid.UpdateLayout(); collator.Write(nodeOverviewPrintContainer, printTicket); } } finally { collator.EndBatchWrite(); } |
Hat jmd ne Ahnung warum das nicht so funktioniert wie es soll? Bzw. kennt jmd ne Alternative die das realisiert was ich möchte?
MfG & Thx Bergmann89