2011-09-13 55 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

什么是动态调整大小的规则/方程。好的,这个分数是70%,但是如何确定第一个?如果你想为第二个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相关。目前这只适用于原始渲染。我无法弄清楚如何将Converter注册为resize事件。实际上可能需要将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 x:Name="headerText" Text="Lorem ipsum dolor"> 
       <TextBlock.LayoutTransform> 
        <ScaleTransform ScaleX="1.1" ScaleY="1.1" /> 
       </TextBlock.LayoutTransform> 
    </TextBlock> 
20

使用TextBlock元素的属性TextWrapping

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

这是我的答案。谢谢。 –

相关问题