2009-03-10 3 views
17

WPF를 사용하여 많은 수의 짧은 문자열을 측정하는 가장 효율적인 방법은 무엇입니까? 특히, 나는 각 문자열의 표시 높이를 결정하고, 동일한 서식 (동일한 글꼴, 크기, 무게 등) 및 문자열이 차지할 수있는 최대 너비를 결정하고 싶습니다.WPF에서 텍스트 측정

+1

같은 질문을 몇 가지 더 나은 솔루션을 가지고

public Size MeasureString(string s) { if (string.IsNullOrEmpty(s)) { return new Size(0, 0); } var TextBlock = new TextBlock() { Text = s }; #if SILVERLIGHT return new Size(TextBlock.ActualWidth, TextBlock.ActualHeight); #else TextBlock.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity)); return new Size(TextBlock.DesiredSize.Width, TextBlock.DesiredSize.Height); #endif } 
: http://social.msdn.microsoft.com/Forums/en-US/wpf/

return new Size(TextBlock.ActualWidth, TextBlock.ActualHeight); 

전체 코드는 다음과 같습니다 thread/a450b0aa-7086-4145-9eff-a779571b6187/ – srgstm

답변

12

대부분의 저수준 기법 (따라서 창조적 최적화를위한 최대 범위 제공)은 GlyphRuns를 사용하는 것입니다.

아주 잘 문서화하지만 난 여기에 작은 예를 썼다 아니에요 :

http://smellegantcode.wordpress.com/2008/07/03/glyphrun-and-so-forth/

예는 렌더링하기 전에 필요한 단계로 문자열의 길이를 밖으로 작동합니다.

3

당신은 폭과 높이를 얻기 위해 렌더링 된 텍스트 상자에 DesiredSize를 속성을 사용할 수 있습니다

using System.Windows.Threading; 

... 

Double TextWidth = 0; 
Double TextHeight = 0; 
... 

MyTextBox.Text = "Words to measure size of"; 
this.Dispatcher.BeginInvoke(
    DispatcherPriority.Background, 
    new DispatcherOperationCallback(delegate(Object state) { 
     var size = MyTextBox.DesiredSize; 
     this.TextWidth = size.Width; 
     this.TextHeight = size.Height; 
     return null; 
    } 
) , null); 

당신은 문자열의 많은 수의 첫 사전 calualte에 빨리마다의 높이와 폭 될 수있는 경우 indiviudal 문자와 기호를 주어진 글꼴로 변환 한 다음 char 문자를 기반으로 계산을 수행합니다. 이것은 커닝 (kerning) 등으로 인해 100 % 정확하지 않을 수 있습니다.

5

FormattedText 클래스를 사용하면 매우 간단합니다. 사용해보기.

WPF에서
+0

UniversalWindows에서는 FormattedText를 사용할 수 없습니다. 도와주세요! –

5

:

는 DesiredSize를 속성을 읽기 전에 TextBlock의()를 측정를 호출해야합니다.

TextBlock이가 즉석에서 만든, 아직 표시되지 않은 경우, 당신은과 같이, 첫째) 측정을 (전화를해야 :

MyTextBlock.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity)); 

return new Size(MyTextBlock.DesiredSize.Width, MyTextBlock.DesiredSize.Height); 

실버 라이트에서 :

측정 할 필요가 없습니다.

MSDN 포럼에
관련 문제