2010-06-07 7 views
12

Ich habe eine WPF DataTemplate mit zwei TextBlock-Steuerelementen (gestapelt) und dann einige andere Elemente darunter. Aufgrund eines komplizierten Layout-Codes muss ich die Höhe der beiden TextBlock-Elemente kennen, damit ich einige ausgefallene Verbindungslinien zeichnen und andere Steuerelemente ausrichten kann.Wie messe ich die Größe eines TextBlocks in WPF, bevor es gerendert wird?

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

Antwort

22

Ich denke, es sollte ausreichen, die UIElement.Measure(Size) Methode aufzurufen und anschließend die UIElement.DesiredSize Eigenschaft zu überprüfen. Weitere Informationen finden Sie in den bereitgestellten MSDN-Links.

+0

+1, aber beachten Sie, dass neben der üblichen Schriftart und Schriftgröße auch eine (geerbte) angefügte Eigenschaft vorhanden ist, die sich auf [font font] bezieht (http://blogs.msdn.com/b/text /archive/2009/08/24/wpf-4-0-text-stack-improvements.aspx) (ob auf ganze Pixel ausgerichtet werden soll oder nicht), und dies wirkt sich auf die Breite des Textes aus. Die angefügte Eigenschaft ist 'TextOptions.FormattingMode' - stellen Sie sicher, dass der Wert dieser Eigenschaft für das Objekt, das Sie messen, mit dem Wert für das Objekt übereinstimmt, das Sie rendern (wenn sie nicht identisch sind). – Cameron

+4

hatte gerade das gleiche Problem und rief nur 'textblock.Measure (new Size());' nicht genug. Ich musste 'textblock.Measure (new Size (double.PositiveInfinity, double.PositiveInfinity));' verwenden, um ein Ergebnis für 'textblock.DesiredSize' zu ​​erhalten. – metacircle

+0

Denken Sie daran, dass' MinWidth' auf 0 und 'MaxWidth auf 0 gesetzt werden muss 'vor der Messung auf PositiveInfinity gesetzt, ansonsten wird sie durch diese Werte begrenzt. – zmechanic

2

Der Aufruf an UIElement.Measure(Size), übernimmt als Parameter Size. Der zweite Aufruf UIElement.DesiredSize gibt die Size zurück, die Sie in die Measure-Methode übergeben haben.

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

+2

Nein, nicht unbedingt. Auch ohne das UIElement (in meinem Fall auch einen TextBlock) zu einem übergeordneten Steuerelement hinzuzufügen, wurde DesiredSize korrekt eingestellt, nachdem ich Measure mit einer ausreichend großen verfügbaren Größe als Parameter aufgerufen habe. – slurmomatic

0

Ich schätze, dass dies eine ziemlich alte Frage, aber ich habe festgestellt, dass mit dem folgenden Code

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

dsrdSize als {47.05,15.96} zurückgegeben. Der Trick scheint die msrSize größer als die erwartete tatsächliche Größe zu machen. msrSize scheint als Begrenzung für das DesiredSize() - Ergebnis zu fungieren. Wenn Sie beispielsweise msrSize = new Size (10, 10) verwenden, ergibt sich hier eine dsrdSize von {10,10}. Hoffe, das hilft jemandem.

0
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); 
} 
Verwandte Themen