2010-06-07 8 views
12

두 개의 TextBlock 컨트롤 (스택)과 그 아래에 다른 요소가있는 WPF DataTemplate이 있습니다. 일부 복잡한 레이아웃 코드로 인해 두 개의 TextBlock 요소의 높이를 알아야 멋진 연결선을 그릴 수 있고 다른 컨트롤 등을 정렬 할 수 있습니다.렌더링되기 전에 WPF에서 TextBlock의 크기를 어떻게 측정합니까?

TextBlocks로 들어갈 텍스트를 알고 있다면 , 그리고 실제로 글꼴을 렌더링하지 않고 이러한 TextBlocks의 높이를 계산하거나 측정 할 수있는 방법이 글꼴 등을 알고 있습니까?

답변

22

UIElement.Measure(Size) 메서드를 호출 한 다음 UIElement.DesiredSize 속성을 확인하는 것으로 충분하다고 생각합니다. 자세한 내용은 제공된 MSDN 링크를 확인하십시오.

+0

+1하지만 일반적인 글꼴과 글꼴 크기 외에도 [글꼴 힌팅에 영향을주는] (상속 된) 첨부 속성이 있습니다 (http://blogs.msdn.com/b/text). /archive/2009/08/24/wpf-4-0-text-stack-improvements.aspx) (전체 픽셀에 정렬할지 여부), 이는 텍스트의 너비에 영향을줍니다. 연결된 속성은'TextOptions.FormattingMode'입니다. - 측정중인 객체의이 속성 값이 렌더링중인 객체의 값과 일치하는지 확인하십시오 (동일하지 않은 경우). – Cameron

+4

그냥 같은 문제가있어서'textblock.Measure (new Size());를 호출하면 충분하지 않습니다. 'textblock.DesiredSize'에 대한 결과를 얻으려면'textblock.Measure (new Size (double.PositiveInfinity, double.PositiveInfinity));'를 사용해야했습니다. – metacircle

+0

'MinWidth'를 0으로 설정해야하고,'MaxWidth '측정하기 전에 PositiveInfinity로 설정하십시오. 그렇지 않으면 해당 값으로 제한됩니다. – zmechanic

2

UIElement.Measure(Size)에 대한 호출은 매개 변수로 Size을 취합니다. 두 번째 호출 UIElement.DesiredSizeMeasure 메소드로 전달 된 Size을 반환합니다.

이 경우 UIElement (이 경우 TextBlock)이 어떤 컨트롤의 자식이 아니기 때문에 (DesiredSize) 다른 이유가있을 이유가 없습니다.

+2

아니요, 반드시 그런 것은 아닙니다. 부모 컨트롤에 UIElement (내 경우에는 TextBlock)를 추가하지 않아도 충분히 큰 availabe 크기를 가진 Measure를 매개 변수로 호출 한 후 DesiredSize가 올바르게 설정되었습니다. – slurmomatic

0

나는이 다소 오래된 질문이다 고맙지 만 나는 다음과 같은 코드를 사용하는 것은

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

dsrdSize가 {47.05,15.96}로 반환되는 것을 발견했다. 트릭은 msrSize를 예상 된 실제 크기보다 크게 만드는 것으로 보입니다. msrSize는 DesiredSize() 결과의 제한으로 작용하는 것 같습니다. 예를 들어 msrSize = new Size (10, 10)를 사용하면 dsrdSize가 {10,10}이됩니다. 희망이 있으면 도움이됩니다.

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); 
} 
관련 문제