2010-06-07 18 views
12

Mam WPF DataTemplate z dwoma kontrolkami TextBlock (ułożone), a następnie niektóre inne elementy pod spodem. Z powodu skomplikowanego kodu układu, muszę znać wysokość dwóch elementów TextBlock, tak aby móc narysować kilka fantazyjnych linii łączących i wyrównać inne kontrolki itp.Jak zmierzyć rozmiar obiektu TextBlock w WPF przed renderowaniem?

Jeśli znam tekst, który trafia do TextBlocks i znam czcionkę itp., czy w jakiś sposób mogę obliczyć lub zmierzyć wysokość tych bloków TextBlock bez ich renderowania?

Odpowiedz

22

Myślę, że powinno wystarczyć wywołanie metody UIElement.Measure(Size), a następnie sprawdzenie właściwości UIElement.DesiredSize. Aby uzyskać więcej informacji, sprawdź udostępnione łącza MSDN.

+0

+1, należy jednak pamiętać, że w dodatku do zwykłych wyglądzie i rozmiarem czcionki, nie jest również (dziedziczone) przymocowany Właściwość [wpływa hinting] (http://blogs.msdn.com/b/text /archive/2009/08/24/wpf-4-0-text-stack-improvements.aspx) (czy wyrównać do całych pikseli czy nie), a to wpływa na szerokość tekstu. Załączona właściwość to 'TextOptions.FormattingMode' - upewnij się, że wartość tej właściwości na mierzonym obiekcie jest zgodna z wartością renderowanego obiektu (jeśli nie są one takie same). – Cameron

+4

Po prostu miałem ten sam problem i po prostu wywoływanie 'textblock.Measure (new Size());' aint enough. Musiałem użyć 'textblock.Measure (nowy rozmiar (double.PositiveInfinity, double.PositiveInfinity));' aby uzyskać wynik dla 'textblock.DesiredSize' – metacircle

+0

Pamiętaj, że' MinWidth' musi być ustawiony na 0, a 'MaxWidth 'przed pomiarem ustaw wartość PositiveInfinity, w przeciwnym razie będzie ona ograniczona tymi wartościami. – zmechanic

2

Połączenie z numerem UIElement.Measure(Size) przyjmuje jako parametr Size. Drugie połączenie UIElement.DesiredSize zwróciło wszystkie podane przez ciebie Size do metody .

Myślę, że tak jest, ponieważ UIElement (TextBlock w tym przypadku) NIE jest dzieckiem żadnej kontroli (jeszcze) i dlatego DesiredSize nie ma żadnego powodu, aby być czymś innym.

+2

Nie, niekoniecznie. Nawet bez dodawania UIElement (w moim przypadku także TextBlock) do kontrolki nadrzędnej, DesiredSize został poprawnie ustawiony po tym, jak wywołałem Measure z wystarczająco dużą dostępną wielkością jako parametrem. – slurmomatic

0

Doceniam, że jest to raczej stare pytanie, ale stwierdziliśmy, że za pomocą następującego kodu

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

dsrdSize jest zwracany jako {47.05,15.96}. Wydaje się, że sztuczka powoduje, że msrSize jest większy niż oczekiwany rzeczywisty rozmiar. msrSize wydaje się działać jako ograniczenie dla wyniku DesiredSize(). Na przykład za pomocą msrSize = new Size (10, 10) można uzyskać wartość parametru dsrdSize o wartości {10,10}. Mam nadzieję, że to pomoże komuś.

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); 
} 
Powiązane problemy