Benutzer mit den meisten Antworten
WPF-Control drucken, Datum und Überschrift zufügen

Frage
-
Hallo zusammen,
dem Grid aus der WPF möchte ich beim Drucken ein Datum und eine Überschrift hinzufügen. Wie geht das?
Das Grid ist definiert als:
<Grid x:Name="beispielgrid" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ></Grid>
Es wird im Code behind mit Zeilen und Spalten als Ergebnis einer Berechnung gefüllt.
Dann kann ein Button geklickt werden und das Grid wird gedruckt:
private void PrintBeispielgridButton_Click(object sender, RoutedEventArgs e) { PrintDialog dialog = new PrintDialog(); dialog.PrintTicket.PageOrientation = PageOrientation.Landscape; int seitenrand = 100; Size seitengroesse = new Size(dialog.PrintableAreaWidth - seitenrand * 2, dialog.PrintableAreaHeight - seitenrand); beispielgrid.Measure(seitengroesse); beispielgrid.Arrange(new Rect(seitenrand, seitenrand, seitengroesse.Width, seitengroesse.Height)); if (dialog.ShowDialog() == true) { dialog.PrintVisual(beispielgrid, "Sell Heatmap"); } }
Das Drucken funktioniert problemlos. Nun möchte ich gerne wie oben beschrieben zusätzlich eine Überschrift und das aktuelle Datum mit drucken.
Mit freundlichen Grüßen
Ottilie
Antworten
-
Hallo,
du musst ein Visual erstellen, das außer dem Grid ein Element für die Überschrift und eines für das Datum enthält. Du könntest also
- in dem UI, das du schon hast um das Grid ein StackPanel legen und in dem StackPanel je einen TextBlock für die beiden zusätzlichen Elemente. Im 'Normalbetrieb' steht bei den TextBlocks die Eigenschaft Visible auf Collapsed (Sie sind also unsichtbar und benötigen auch keinen Rand etc.). Beim Drucken schaltest Du die Sichtbarkeit ein und druckst statt des Grids das StackPanel (ggf. rufst du noch InvalidateVisual vor den Arranges auf ... bitte ausprobieren).
- Du baust dir ein eigenes DruckVisual (zB ein Grid), in dem Du Überschrift und Datum ausrichtest, wo Du willst (zB Seitenkopf). In dieses Grid fügst du vor dem Drucken das Grid ein (Parent des Grids umstellen auf das DruckVisual; nach dem Drucken wieder zurück stellen).
Mit der zweiten Methode bist du wohl im Design freier. Daher würde ich diesen Weg gehen. Wenn du aber keine großen Ansprüche an das Design hast, ist 1. etwas einfacher.
Gruß
Jürgen- Als Antwort markiert ottilie Donnerstag, 17. Oktober 2013 10:45
-
Hallo,
du brauchst lediglich ein Control, welches dein Grid sowie die zusätzlichen Daten aufnimmt. Hier ein einfaches Beispiel mit einem Grid als Container://g1 ist mein Grid im Window //rootGrid enthält g1 Grid g = new Grid(); g.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Auto), });//Zeilen hinzufügen, für Spalten ähnlich g.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Auto), }); TextBlock tbDate = new TextBlock()//TextBlock anlegen { Text = DateTime.Now.ToString(),//Datum und Uhrzeit }; Grid.SetRow(tbDate, 0);//Zeile setzen g.Children.Add(tbDate);//TextBlock zum Grid hinzufügen this.rootGrid.Children.Remove(g1);//Element aus Logischem Baum entfernen, jedes Element kann nur einmal enthalten sein. Grid.SetRow(g1, 1);//Zeile setzen g.Children.Add(g1); g2.Children.Add(g); //Hier g drucken g.Children.Remove(g1);//Grid aus temporären Element entfernen this.rootGrid.Children.Add(g1);//Element in Logischem Baum einfügen
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.- Als Antwort markiert ottilie Donnerstag, 17. Oktober 2013 10:44
-
Einen Fehler gibt's noch bei der Sache: In dem Moment, in dem ich das Grid aus dem logischen Baum entferne, verschwindet es von der Oberfläche. Das sieht nicht schön aus. Gibt es eine einfache Möglichkeit eine Kopie des Grids zu erstellen und diese dann zu drucken?
Das hatte ich anfangs in meinem Beispiel auch versucht, es gibt aber keine Clone Methode o.ä. die das einfach übernehmen kann. Es gibt diverse Möglichkeiten diese Funktionalität trotzdem einzubauen. Siehe hier und hier. Ob sich das zu 100% lohnt kann ich dir allerdings auch nichts sagen.
Ich wundere mich sowieso, Drucken mit Titel und Datum ist doch eine gängige Sache. Ich hätte gedacht, dass es dafür irgendwo eine Methode gibt.
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.- Als Antwort markiert ottilie Donnerstag, 17. Oktober 2013 15:46
Alle Antworten
-
Hallo,
du musst ein Visual erstellen, das außer dem Grid ein Element für die Überschrift und eines für das Datum enthält. Du könntest also
- in dem UI, das du schon hast um das Grid ein StackPanel legen und in dem StackPanel je einen TextBlock für die beiden zusätzlichen Elemente. Im 'Normalbetrieb' steht bei den TextBlocks die Eigenschaft Visible auf Collapsed (Sie sind also unsichtbar und benötigen auch keinen Rand etc.). Beim Drucken schaltest Du die Sichtbarkeit ein und druckst statt des Grids das StackPanel (ggf. rufst du noch InvalidateVisual vor den Arranges auf ... bitte ausprobieren).
- Du baust dir ein eigenes DruckVisual (zB ein Grid), in dem Du Überschrift und Datum ausrichtest, wo Du willst (zB Seitenkopf). In dieses Grid fügst du vor dem Drucken das Grid ein (Parent des Grids umstellen auf das DruckVisual; nach dem Drucken wieder zurück stellen).
Mit der zweiten Methode bist du wohl im Design freier. Daher würde ich diesen Weg gehen. Wenn du aber keine großen Ansprüche an das Design hast, ist 1. etwas einfacher.
Gruß
Jürgen- Als Antwort markiert ottilie Donnerstag, 17. Oktober 2013 10:45
-
Hallo,
du brauchst lediglich ein Control, welches dein Grid sowie die zusätzlichen Daten aufnimmt. Hier ein einfaches Beispiel mit einem Grid als Container://g1 ist mein Grid im Window //rootGrid enthält g1 Grid g = new Grid(); g.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Auto), });//Zeilen hinzufügen, für Spalten ähnlich g.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Auto), }); TextBlock tbDate = new TextBlock()//TextBlock anlegen { Text = DateTime.Now.ToString(),//Datum und Uhrzeit }; Grid.SetRow(tbDate, 0);//Zeile setzen g.Children.Add(tbDate);//TextBlock zum Grid hinzufügen this.rootGrid.Children.Remove(g1);//Element aus Logischem Baum entfernen, jedes Element kann nur einmal enthalten sein. Grid.SetRow(g1, 1);//Zeile setzen g.Children.Add(g1); g2.Children.Add(g); //Hier g drucken g.Children.Remove(g1);//Grid aus temporären Element entfernen this.rootGrid.Children.Add(g1);//Element in Logischem Baum einfügen
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.- Als Antwort markiert ottilie Donnerstag, 17. Oktober 2013 10:44
-
Hallo Jürgen, hallo Tom,
vielen Dank für Eure Mühe, mit Toms Code funktioniert alles wunderbar. Einen Fehler gibt's noch bei der Sache: In dem Moment, in dem ich das Grid aus dem logischen Baum entferne, verschwindet es von der Oberfläche. Das sieht nicht schön aus. Gibt es eine einfache Möglichkeit eine Kopie des Grids zu erstellen und diese dann zu drucken?
Ich wundere mich sowieso, Drucken mit Titel und Datum ist doch eine gängige Sache. Ich hätte gedacht, dass es dafür irgendwo eine Methode gibt.
Gruß
Ottilie
-
Einen Fehler gibt's noch bei der Sache: In dem Moment, in dem ich das Grid aus dem logischen Baum entferne, verschwindet es von der Oberfläche. Das sieht nicht schön aus. Gibt es eine einfache Möglichkeit eine Kopie des Grids zu erstellen und diese dann zu drucken?
Das hatte ich anfangs in meinem Beispiel auch versucht, es gibt aber keine Clone Methode o.ä. die das einfach übernehmen kann. Es gibt diverse Möglichkeiten diese Funktionalität trotzdem einzubauen. Siehe hier und hier. Ob sich das zu 100% lohnt kann ich dir allerdings auch nichts sagen.
Ich wundere mich sowieso, Drucken mit Titel und Datum ist doch eine gängige Sache. Ich hätte gedacht, dass es dafür irgendwo eine Methode gibt.
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.- Als Antwort markiert ottilie Donnerstag, 17. Oktober 2013 15:46