2011-08-18 3 views
7

크기가 511, 높이 = 159 인 텍스트 블록이 있습니다. FontSize = 28. 모든 텍스트가 표시되도록 텍스트가 텍스트 블록의 크기를 초과하는 경우 글꼴 크기를 변경하고 싶습니다. 이 일을하는 방법이 있습니까? 아마도식이 요?텍스트가 텍스트 블록 경계를 초과하는 경우 글꼴 크기 변경

+0

입니다. 나는 텍스트 블록의 크기를 유지하고 글꼴 크기 만 변경하려고합니다. – patlimosnero

+2

다음은 TextRenderer.MeasureText를 사용하는 유사한 게시물입니다. http://stackoverflow.com/questions/1453327/relation-between-length-and-font-size-string-and-width-of-a-textbox. 글꼴 크기 비율에 맞출 수있는 방법이 있는지 궁금합니다. – Josh

+0

TextBlock을 ScrollViewer에 랩 한 다음 가로 스크롤 막대가 나타날 때 이벤트를 처리하는 경우. 그런 다음 글꼴 크기를 조정하고 나타나는 스크롤바를 취소 할 수 있습니다. 이론적으로 ... 나는 이것이 가능한지 아직 확인하지 않았지만하겠다. –

답변

0

WPF에 대해서는 잘 모르겠지만 WinForms에서는 MeasureString 메서드를 사용하여 주어진 글꼴의 문자열 크기를 측정 할 수 있습니다. 따라서 텍스트 블록의 내용이 변경 될 때마다이 방법을 사용해야하며 텍스트의 크기가 텍스트 블록의 크기보다 크면 글꼴 크기를 줄이고 다시 측정하십시오.

(나는이 작성한 후에 지금, 나는 이것에 대한 간단한 방법이 있어야한다고 생각합니다)

그것은 당신이, 예를 들어, 택배 뉴는 각 문자를 갖도록 설계되어 사용 어떤 글꼴 얼굴에 따라
0

같은 너비, 그래서 만약 당신이 문자 당 너비가 무엇인지에 대해 연구한다면 문자열에 길이 가져 오기 함수를 사용할 수 있습니다 (길이를 문자로 제공). 그 너비는 픽셀 단위로 계산됩니다. 너비가 511px를 초과하면 그에 따라 크기가 조정됩니다.

Arial과 같은 다른 글꼴을 사용하는 경우에도 동일한 작업을 수행 할 수 있으며 정확하게 입력하려면 'i', 'l'등의 작은 글자로 알파벳을 그룹화하고 ' t '와 지방 문자'o '와 대문자. 그런 다음 좁은, 중간 및 뚱뚱한 글자의 수를 얻고 그 데이터로부터 크기를 계산합니다. 그러나 개인적으로 그것은 나에게 너무 많은 것입니다.

희망이있었습니다.

편집 :이 글을 무시하고, 나는 방금 measurestring 함수에 대해 읽었습니다. 그것은 제 제안보다 훨씬 적은 노력입니다.

0

다음은 내가 생각해 낸 것입니다. -1.0 글꼴 크기를 처리해야합니다.

 private static double GetFontSize(TextBox textBox) 
     { 
     double fontSize = textBox.FontSize; 
     FormattedText ft = new FormattedText(textBox.Text, CultureInfo.CurrentCulture, System.Windows.FlowDirection.LeftToRight, 
              new Typeface(textBox.FontFamily, textBox.FontStyle, textBox.FontWeight, textBox.FontStretch), 
              fontSize, textBox.Foreground); 
     while (textBox.Width < ft.Width) 
     { 
      fontSize -= 1; 
      if (fontSize < 0) return -1.0; 
      ft = new FormattedText(textBox.Text, CultureInfo.CurrentCulture, System.Windows.FlowDirection.LeftToRight, 
                 new Typeface(textBox.FontFamily, textBox.FontStyle, textBox.FontWeight, textBox.FontStretch), 
                 fontSize, textBox.Foreground); 
     } 

     return fontSize; 
     } 
0

편집 : 게시하기 전에 태그를 확인해야합니다. 이 문제를 해결하기 위해 WPF가 제공 할 수있는 단서가 없습니다.

나는이를 백업 할 증거가없는, 그러나 (또한 가변 폭 글꼴, 적어도 모든 사람이 내 컴퓨터에 설치) 것 같다 :

  • 글꼴 크기가 선형이있다 주어진 문자열
  • 글꼴 크기의 폭과의 관계는 0

의 폭 0 결과 이는 아마도 최적의 글꼴 크기를 찾기 위해 보간 후 허용되는 가장 큰 글꼴 크기에 한 번 MeasureString를 사용하고, 수 .

"선형 도로"에는 약간의 "픽셀 범프"가 있기 때문에 몇 픽셀 떨어져있을 수 있습니다.하지만 측정 루프에서 좋은 대안입니다.

2

이 솔루션은 ViewBox를 사용한다는 것을 의미합니다. Wpf 변환 기능을 사용하면 텍스트의 글꼴 크기를 변경할 필요가 없습니다. 거의 동일한 결과를 변환 (및이 경우에는 ViewBox)을 사용하여 얻을 수 있습니다. .

대신의 뷰 박스 내부에있는 TextBlock을 가하고,이 템플릿의 수정 및 텍스트가 뷰 박스 안에 표시 컨트롤을 넣어 무엇인가 : 당신은에 맞게 텍스트의 크기 제어를 얻을 이제

<ControlTemplate TargetType="{x:Type TextBox}">      
    <Microsoft_Windows_Themes:ListBoxChrome x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderFocused="{TemplateBinding IsKeyboardFocusWithin}" SnapsToDevicePixels="true"> 
     <Viewbox HorizontalAlignment="Left"> 
      <ScrollViewer x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
     </Viewbox> 
    </Microsoft_Windows_Themes:ListBoxChrome> 

    <ControlTemplate.Triggers> 
     <Trigger Property="IsEnabled" Value="false"> 
      <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 
      <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

사용 가능한 spacee, 감사 WPF.

또한 여기에 내가 그 폭을 작게 된 본체를 축소하기 때문에 뷰 박스를 사용하려는 해달라고 몇 가지 예를

text example