none
WPF-Control drucken, Datum und Überschrift zufügen RRS feed

  • 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

    Dienstag, 15. Oktober 2013 07:36

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

    1. 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).
    2. 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
    Dienstag, 15. Oktober 2013 15:14
  • 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
    Dienstag, 15. Oktober 2013 15:25
    Moderator
  • 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.

    Oftmals ist es so, weil eine Sache nichts besonderes ist und leicht implementiert werden kann, fertigt das keiner vor. So hast du wenigstens die gesamte Freiheit der Anpassung.

    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
    Donnerstag, 17. Oktober 2013 12:23
    Moderator

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

    1. 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).
    2. 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
    Dienstag, 15. Oktober 2013 15:14
  • 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
    Dienstag, 15. Oktober 2013 15:25
    Moderator
  • 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

    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.

    Oftmals ist es so, weil eine Sache nichts besonderes ist und leicht implementiert werden kann, fertigt das keiner vor. So hast du wenigstens die gesamte Freiheit der Anpassung.

    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
    Donnerstag, 17. Oktober 2013 12:23
    Moderator
  • Hallo Tom,

    der erste Tipp mit dem XamlWriter/XmlReader funktioniert einwandfrei. Jetzt druckt es so wie ich es möchte.

    Vielen Dank

    Ottilie

    Donnerstag, 17. Oktober 2013 15:49