2011-09-13 5 views
27

나는 두 개의 뷰포트가있는 스택 패널이있는 wpf 창을 가지고있다. 각 뷰포트에는 텍스트 블록이있다.WPF TextBlock을 여러 줄에 텍스트로 표시하려면 어떻게합니까?

<Grid> 
    <StackPanel VerticalAlignment="Center" Orientation="Vertical" > 
     <Viewbox Margin="100,0,100,0"> 
      <TextBlock x:Name="headerText" Text="Lorem ipsum dolor" Foreground="Black"/> 
     </Viewbox> 
     <Viewbox Margin="150,0,150,0"> 
      <TextBlock x:Name="subHeaderText" Text="Lorem ipsum dolor, Lorem ipsum dolor, lorem isum dolor, Lorem ipsum dolor, Lorem ipsum dolor, lorem isum dolor, " TextWrapping="Wrap" Foreground="Gray" /> 
     </Viewbox> 
    </StackPanel> 
</Grid> 

내가 얻으려는 것은 상위 텍스트 블록이 더 큰 텍스트의 제목입니다. 두 번째 텍스트 블록은 작은 텍스트가있는 하위 머리글입니다. 제목이나 부제목에 아무리 많은 텍스트가 있더라도 글꼴은 동적으로 작아 져야합니다. 내 문제는 내가 소제목을 고정 너비로하고 싶습니다. 즉, 텍스트의 양에 따라 글꼴이 제목의 백분율 (70 %)이어야하고 여러 줄로 묶어야합니다. 나는 지금까지 가지고있는 코드를 동봉했다 ... 그 소제목으로 무언가를 놓치고있다. 건배

편집 기본적으로 내가 달성하고자하는 것은이 폰트는 제목의 70 % 인 상태 아래쪽으로 확장 할 수 있도록 서브 헤더 텍스트를 감싸는 것입니다 -에 상관없이 글꼴 것을 얼마나 큰.

+0

동적 크기 조정에 대한 규칙/방정식은 무엇 :

<TextBlock x:Name="headerText" Text="Lorem ipsum dolor"> <TextBlock.LayoutTransform> <ScaleTransform ScaleX="1.1" ScaleY="1.1" /> </TextBlock.LayoutTransform> </TextBlock> 
Paparazzi

+0

이것은 화면 크기/해상도를 모르는 환경에서 사용하기위한 것입니다. 너비는 여백을 사용하여 설정되므로 모든 화면에서 동일하게 동작 할 수 있습니다. 제목의 크기는 뷰포트에 의해 결정됩니다. 즉, 텍스트 블록이 항상 최대 크기로 표시됩니다. - 다시 화면 해상도에 따라. –

답변

56

StackPanel에 둥지를 튼 것은 텍스트 상자가 제대로 마무리하게됩니다 :

<Viewbox Margin="120,0,120,0"> 
    <StackPanel Orientation="Vertical" Width="400"> 
     <TextBlock x:Name="subHeaderText" 
        FontSize="20" 
        TextWrapping="Wrap" 
        Foreground="Black" 
        Text="Lorem ipsum dolor, lorem isum dolor,Lorem ipsum dolor sit amet, lorem ipsum dolor sit amet " /> 
    </StackPanel> 
</Viewbox> 
+6

문제가 해결 되었습니까? 고정 너비 및 고정 된 전면 크기는 문제 문과 일치하지 않는 것 같습니다. – Paparazzi

+1

@Blam - 텍스트를 줄 바꾸기를 원하지만 너비보다 작은 경우 초과 공간을 원하지 않으면 대신 MaxWidth를 사용할 수 있습니다. – Robotnik

3

이이 부분의 방법을 가져옵니다. ActualFontSize 속성은 없지만 ActualHeight가 있고이 속성은 FontSize와 관련됩니다. 지금은 원본 렌더링의 경우에만 크기입니다. Resize 이벤트로 Converter를 등록하는 방법을 알 수 없습니다. 사실 FontSize를 resize 이벤트로 등록해야 할 수도 있습니다. 불완전한 답변을 위해 저를 표시하지 마십시오. 나는 코드 샘플을 주석에 넣을 수 없었다.

<Window.Resources> 
     <local:WidthConverter x:Key="widthConverter"/> 
    </Window.Resources> 
    <Grid> 
     <Grid> 
      <StackPanel VerticalAlignment="Center" Orientation="Vertical" > 
       <Viewbox Margin="100,0,100,0"> 
        <TextBlock x:Name="headerText" Text="Lorem ipsum dolor" Foreground="Black"/> 
       </Viewbox> 
       <TextBlock Margin="150,0,150,0" FontSize="{Binding ElementName=headerText, Path=ActualHeight, Converter={StaticResource widthConverter}}" x:Name="subHeaderText" Text="Lorem ipsum dolor, Lorem ipsum dolor, lorem isum dolor, Lorem ipsum dolor, Lorem ipsum dolor, lorem isum dolor, " TextWrapping="Wrap" Foreground="Gray" /> 
      </StackPanel> 
     </Grid> 
    </Grid>   

변환기

[ValueConversion(typeof(double), typeof(double))] 
    public class WidthConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      double width = (double)value*.7; 
      return width; // columnsCount; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
2

그냥 휴식 후 조금 더 큰 헤더 글꼴을 원한다면, 당신은 ScaleTransform을 사용할 수 있습니다. 그래서 당신은 진짜 글꼴 크기에 의존하지 않습니다.

<TextBlock Text="StackOverflow Forum" 
      Width="100" 
      TextWrapping="WrapWithOverflow"/> 
20

TextBlock 요소의 특성 TextWrapping을 사용합니다. 확인 하위 70 %하지만 첫 번째 크기를 어떻게? 두 번째 TextBlock의 너비를 고정하려면 너비를 설정하십시오.
+1

이것은 제 대답입니다. 고마워. –

관련 문제