Wie messe ich die Größe eines Textblocks in WPF, bevor er gerendert wird?
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?
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);
}