none
ActualHeight von TextBlock beim Drucken ermitteln? RRS feed

  • Frage

  • Hallo,

    ich habe mal wieder eine Frage.

    Ich bin gerade dabei meine WPF-Projekte um eine Druckfunktion zu erweitern. Um Texte auszudrucken erstelle ich ein FixedDocument mit FixedPages. Die einzelnen Daten in Textform füge ich jeweils einem TextBlock zu. Mit FormattedText ermittle ich die Textlänge und –höhe um sie dann auf der FixedPage zu positionieren. Es funktioniert auch alles so wie ich will.  

    Probleme bereitet mir nur langer bzw. mehrzeiliger Text, wenn er umgebrochen wird.  Ich brauche dann ActualHeight des Controls um das nächste zu positionieren. Dieses Property steht aber zu diesem Zeitpunkt noch nicht zur Verfügung, da das Element das Layout noch nicht aktualisiert hat. Auch die vorhergehenden Aufrufe von InvalidateMeasure,  InvalidateArrange, UpdateLayout helfen nicht. Ich habe auch die Property LineCount der TextBox mit dem gleichen negativen Ergebnis getestet. Zur Zeit ermittle ich die Zeilenanzahl aus der Textlänge und der vorgegeben Weite des Controls. Diese multipliziere ich mit der Texthöhe um die Höhe des TextBlocks zu bekommen, die ich benötige um das nächste Control zu positionieren. Dies funktioniert leider nur, wenn die umgebrochenen Textzeilen nicht zu kurz sind.

    Deshalb:  Gibt es noch eine andere Möglichkeit an die Property  ActualHeight oder die aktuelle Zeilenzahl nach dem Umbruch zu kommen? Notfall könnte ich den Zeilenumbruch auch manuell ausführen. Möchte mir aber den Aufwand sparen, wenn es in WPF eine Möglichkeit gibt.

    Ich hoffe, ich konnte mein Problem verständlich schildern. Ich kann auch gerne, wenn gewünscht, den verwendeten Code posten.

    Danke im Voraus und ein schönes Pfingstfest.

    Klaus.

    Sonntag, 9. Juni 2019 12:15

Antworten

  • Hallo Klaus,

    Hast Du versucht, die benutzerdefinierte WpfPrint-Hilfsklasse zu verwenden, die im folgenden Thread beschrieben wird:
    WPF - Auto Line Number for FlowDocument?
    Auch Textblöcke, die Du hinzufügst, werden automatisch umgebrochen, wenn sie während der Erstellung umgebrochen werden. Jedes Element wird bei der Hinzufügung gemessen.

    Gruß,

    Ivan Dragov


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.


    Montag, 10. Juni 2019 11:33
    Moderator

Alle Antworten

  • Hallo Klaus,

    Hast Du versucht, die benutzerdefinierte WpfPrint-Hilfsklasse zu verwenden, die im folgenden Thread beschrieben wird:
    WPF - Auto Line Number for FlowDocument?
    Auch Textblöcke, die Du hinzufügst, werden automatisch umgebrochen, wenn sie während der Erstellung umgebrochen werden. Jedes Element wird bei der Hinzufügung gemessen.

    Gruß,

    Ivan Dragov


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.


    Montag, 10. Juni 2019 11:33
    Moderator
  • Hallo Ivan,

    Vielen Dank für Deinen Tipp. 

    UIElement.Measure  und .DesiredSize, die in der WPFPrint-Hilfsklasse verwendet werden, sind genau das was ich gesucht habe.

    Ich hatte mir zwischenzeitlich als Notlösung eine Methode für den manuellen Zeilenumbruch geschrieben bei der erste Test auch gut funktionierten. ich werde diese aber wieder verwerfen und mit den o.g. Methoden arbeiten.

    Gruß

    Klaus
    Montag, 10. Juni 2019 13:11