Frage

Ich habe eine WPF -DataTemplate mit zwei Textblöckensteuerungen (gestapelt) und dann einigen anderen Elementen darunter. Aufgrund eines komplizierten Layout -Codes muss ich die Höhe der beiden Textblockelemente kennen, damit ich einige ausgefallene Anschlusslinien zeichnen und andere Steuerelemente usw. ausrichten kann.

Wenn ich den Text kenne, der in die Textblöcke geht, und ich kenne die Schrift usw., gibt es eine Möglichkeit, die Höhe dieser Textblöcke zu berechnen oder zu messen, ohne sie tatsächlich zu rendern?

War es hilfreich?

Lösung

Ich denke, es sollte ausreichen, das anzurufen UIElement.Measure(Size) Methode und anschließend die Überprüfung der UIElement.DesiredSize Eigentum. Weitere Informationen finden Sie in den bereitgestellten MSDN -Links.

Andere Tipps

Der Anruf an UIElement.Measure(Size), nimmt als Parameter Size. Der zweite Anruf UIElement.DesiredSize Gibt was auch immer zurück Size Sie gingen in die Measure Methode.

Ich denke, das ist der Fall, weil UIElement (TextBlock in diesem Fall) ist (noch) und daher kein Kind einer Kontrolle DesiredSize Hat keinen Grund, etwas anderes zu sein.

Ich weiß zu schätzen, dass dies eine ziemlich alte Frage ist, aber ich habe festgestellt, dass die Verwendung des folgenden Code

        TextBlock textBlock = new TextBlock();
        textBlock.Text = "NR valve";
        Size msrSize = new Size(100, 200);
        textBlock.Measure(msrSize);
        Size dsrdSize = textBlock.DesiredSize;

DSRDSIZE wird als {47.05,15,96} zurückgegeben. Der Trick scheint das MSRSize größer zu machen als die erwartete tatsächliche Größe. MSRSIZE scheint als Grenze für das gewünschte Ergebnis () zu wirken. Beispielsweise führt die Verwendung von MSRSIZE = NEW SRIPE (10, 10) hier zu einem DSRDSIZE von {10,10}. Hoffe das hilft jemandem.

public static Size ShapeMeasure(TextBlock tb) {
    // Measured Size is bounded to be less than maxSize
    Size maxSize = new Size(
         double.PositiveInfinity, 
         double.PositiveInfinity);
    tb.Measure(maxSize);
    return tb.DesiredSize;
}

public static Testit() 
{
    TextBlock textBlock = new TextBlock();
    textBlock.Text = "NR valve";

    Size text size = ShapeMeasure(textBlock);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top