Benutzer mit den meisten Antworten
Drucken von Controls über mehrere Seiten

Frage
-
Hallo Community,
ich habe das Problem, dass ich meine Page im Silverlight drucken möchte.
Folgende Struktur: Ich habe einen Frame, in den per Navigation immer wieder neue Silverlight Pages geladen werden. Der Nutzer soll dann auf Wunsch die entsprechende Seite drucken können. Inklusive aller Bilder und Formatierungen.
Nun ist das Problem, dass ich viele TextBlocks, RichTextBoxen und Labels... dabei habe.
Meine erste Idee, war es eine neue Page anzulegen und jedes Control einem StackPanel hinzuzufügen. (Gibts ein Video im Internet zu) Dabei kam der Fehler, dass die Controls schon der Seite zugeordnet waren. Also musste ich sie vorher von der Seite entfernen...
Mit ein bisschen Fummeln, habe ich es geschafft, dass er die ganze Seite durchgeht und die Sachen auch druckt. Auch mehrseitig. Nun ist das Problem, dass er einiges nicht druckt. Einige RichTextBoxen werden einfach nicht gedruckt, obgleich sie fast identisch mit anderen sind, die gedruckt werden. Der Ausdruck sieht dann zum Beispiel so aus:
ÜBERSCHRIFT
TEXT
BILD
TEXTÜBERSCHRIFT
FEHLENDER TEXTÜBERSCHRIFT
TEXTIch habe keine Ahnung warum das passiert. Eventuell kann mir jemand helfen?
Hier findet ihr meinen Code der Printfunktion. Auskommentiert die Variante mit dem erneuten Auffüllen der Page, um die Schleife zu nutzen.
Page selectedPage = (Page)((Frame)this.FindName(ResourceHandler.GetResource(App.ResControlNames, "FrameContent"))).Content; PrintDocument pd = new PrintDocument(); int itemIndex = 0; pd.PrintPage += (s, pe) => { Page printablePage = PrintHelper.GetContentPage(selectedPage.ToString()); StackPanel itemHost = new StackPanel(); Grid contentGrid = ((Grid)printablePage.Content).Children[1] is Grid ? ((Grid)printablePage.Content).Children[1] as Grid : null; UIElement siteDescription = null; // Site description is available so the content is index 2 if (contentGrid == null) { siteDescription = ((Grid)printablePage.Content).Children[1] as UIElement; contentGrid = ((Grid)printablePage.Content).Children[2] is Grid ? ((Grid)printablePage.Content).Children[2] as Grid : null; } if (itemIndex == 0) { Label head = new Label(); head = ((Grid)printablePage.Content).Children[0] as Label; ((Grid)printablePage.Content).Children.RemoveAt(0); itemHost.Children.Add(head); // Have to fill in an UIElement because it was removed ((Grid)printablePage.Content).Children.Insert(0, new Label()); } if (siteDescription != null) { ((Grid)printablePage.Content).Children.RemoveAt(1); itemHost.Children.Add(siteDescription); // Have to fill in an UIElement because it was removed ((Grid)printablePage.Content).Children.Insert(1, new Label()); } if (contentGrid != null) { for (int i = 0; i < itemIndex; i++) { contentGrid.Children.RemoveAt(0); } contentGrid.Measure(new Size(selectedPage.ActualWidth, double.PositiveInfinity)); while (contentGrid.Children.Count != 0) { UIElement newChild = contentGrid.Children[0] as UIElement; contentGrid.Children.RemoveAt(0); itemHost.Children.Add(newChild); itemHost.Measure(new Size(pe.PrintableArea.Width, double.PositiveInfinity)); if (itemHost.DesiredSize.Height > pe.PrintableArea.Height && itemHost.Children.Count > 1) { itemHost.Children.RemoveAt(itemHost.Children.Count - 1); pe.HasMorePages = true; MessageBox.Show("Has more pages"); break; } itemIndex++; } ////while (itemIndex < contentGrid.Children.Count) ////{ //// UIElement newChild = contentGrid.Children[itemIndex] as UIElement; //// Size newChildSize = ((UIElement)contentGrid.Children[itemIndex]).DesiredSize; //// contentGrid.Children.RemoveAt(itemIndex); //// itemHost.Children.Add(newChild); //// itemHost.Measure(new Size(pe.PrintableArea.Width, double.PositiveInfinity)); //// contentGrid.Children.Insert(itemIndex, new Label() { Height = newChildSize.Height }); //// contentGrid.Measure(new Size(selectedPage.ActualWidth, double.PositiveInfinity)); //// if (itemHost.DesiredSize.Height > pe.PrintableArea.Height && itemHost.Children.Count > 1) //// { //// itemHost.Children.RemoveAt(itemHost.Children.Count - 1); //// pe.HasMorePages = true; //// MessageBox.Show("Has more pages"); //// break; //// } //// itemIndex++; ////} } pe.PageVisual = itemHost; }; pd.Print(selectedPage.Title);
Montag, 14. November 2011 16:29
Antworten
-
- Als Antwort markiert Gozar15 Montag, 2. Januar 2012 16:51
Montag, 2. Januar 2012 16:51
Alle Antworten
-
Hallo Gozar15,
ein einfacherer Ansatz währe nicht alle Objekte zu kopieren und das dann zu drucken, sonden deine Page auf eine BitmapSource zu rendern und das das als Source für ein Image zu verwenden:
WriteableBitmap wb = new WriteableBitmap((int)selectedPage.ActualWidth, (int)selectedPage.ActualHeight); wb.Render(selectedPage, null); Image img = new Image(); img.Height = (int)selectedPage.Height; img.Width = (int)selectedPage.Width; img.Source = wb; pe.PageVisual = img;
Ich weiß leider nicht, ob es funktioniert, aber es müsste ;).
viele Grüße,
Alex
Dienstag, 15. November 2011 10:15 -
Ich konnte den Fehler beheben indem ich die PrintableArea.Width um 100 Pixel verkleinerte.
Jetzt druckt er mir aber die Seite über den unteren Seitenrand hinaus. Meine Abfrage, dass wenn der Inhalt "höher" ist als die PrintableArea, scheint fehlerhaft zu sein. Er druckt nun Elemente auf Seite 1 im Glaube sie passen, aber sie sind nicht zu sehen. Und auf Seite 2 fängt er bei anderen Elementen an.
Hat jemand eine Idee?
Dienstag, 22. November 2011 11:39 -
Ich habe den Fehler gefunden. Er kommt nur bei Seiten, wo ich Bilder aufrufe, die von einer URL kommen. Sie liegen zwar auf meinem Server, aber vermutlich kommt der Druckvorgang bevor das Bild korrekt gesetzt wurde oder die Größe bekannt ist. Da ich das Bild über die Code-Behind setze ist mir nicht klar, warum das so ist, aber nur bei den entsprechenden Seiten taucht der Fehler auf.
Kann mir jemand helfen?????
Dienstag, 22. November 2011 12:16 -
- Als Antwort markiert Gozar15 Montag, 2. Januar 2012 16:51
Montag, 2. Januar 2012 16:51