Gibt es eine Möglichkeit für mich, die Höhe eines Blocks / Abschnitts in einem WPF-Flowdoc zu messen?

  • Ich baue also Schritt für Schritt ein Flussdokument, und ich habe mich gefragt, ob es eine Möglichkeit gibt, die Blockhöhe zu einem bestimmten Zeitpunkt zu messen.

    Mein Code sieht ungefähr so ​​aus:

     section s = new section();
    
    block b1 = new Block(new Run("Text here"));//add height to total block height
    block b2 = new Block(new Run("Text here"));//add height to total block height
    block b3 = new Block(new Run("Text here"));//add height to total block height
    block b4 = new Block(new Run("Text here"));//add height to total block height
    
    s.blocks.add(b1);s.Blocks.Add(b2)...;s.blocks.add(b4)
    //measure section here
    
    FlowDocument f = new FlowDocument;
    
    f.Blocks.Add(s);
     

    Ich könnte jeden Absatz messen, nachdem er es ist hinzugefügt und halten eine laufende Zählung,

    ODER

    Ich könnte den gesamten Abschnitt messen, nachdem alle Blöcke hinzugefügt wurden

    ist es möglich?

    Danke!

    24 August 2011
    Toadums
2 answers
  • Das FlowDocument-Modell, das auf FrameworkContentElement und nicht auf FrameworkElement basiert, erbt nicht die Einstellungen für Sichtbarkeit, Höhe und Breite.

    Die einzige Möglichkeit, die Messung zu erzwingen, bestand nur dann, wenn es keine andere Möglichkeit gab, UIElements mithilfe des BlockUIContainer in das Dokument zu injizieren. Das genannte UIElement könnte dann zur Laufzeit gemessen werden. Um ehrlich zu sein, ist es ein hässlicher Hack, aber ich habe keinen anderen Weg zu diesem Punkt gefunden.

    14 January 2012
    TheZenker
  • So könnten Sie das machen.

     Block b1 = new Block(new Run("Text here"));
    double width = .0;
    
    Rect r = b1.ElementStart.GetCharacterRect(LogicalDirection.Forward);
    
    //add height to total block height
    width += r.Height;
     

    Zum Abrufen kann dieselbe Methode verwendet werden die Höhe sogar der Section. Ich suche immer noch nach einer schnelleren Lösung, aber diese funktioniert gut. Ich werde dich auf dem Laufenden halten, wenn ich sonst noch etwas finde. :)

    26 July 2017
    Prince Owen