it-swarm.cn

如何使WPF TextBlock在多行上显示我的文本?

我有一个wpf窗口,其中有一个带有两个视口的堆栈面板-每个视口中都有一个文本块。

<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%),并根据我有多少文本而换成多行。我附上了到目前为止的代码...我在该子标题下缺少某些内容,无法弄清楚是什么。干杯

Edit基本上,我想要实现的是子标题将文本包装起来,以便它可以向下扩展,字体为标题的70%-不管该字体有多大。

39
Brian Hvarregaard

嵌套堆栈面板将导致文本框正确包装:

<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>
71
Brian Hvarregaard

使用TextWrapping元素的属性TextBlock

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

使用换行符:

<TextBlock>
        <Run Text="Line1"/>
        <LineBreak/>
        <Run Text="Line2" FontStyle="Italic" FontSize="9"/>
        <LineBreak/>
        <Run Text="Line3"/>
    </TextBlock>

请参考以下内容: https://social.msdn.Microsoft.com/Forums/vstudio/en-US/51a3ffe4-ec82-404a-9a99-6672f2a6842b/how-to-give-multiline-in-textblock?forum = wpf

谢谢,

RDV

12
RDV

这到达那里。没有ActualFontSize属性,但是有一个ActualHeight,它与FontSize有关。目前,此尺寸仅适用于原始渲染。我不知道如何将Converter注册为调整大小事件。实际上可能需要将FontSize注册为调整大小事件。请不要把我打乱,以免得到不完整的答案。我无法在注释中添加代码示例。

    <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();
        }
    } 
3
paparazzo

如果只想使标题字体比其他字体大一些,则可以使用ScaleTransform。因此,您不必依赖实际的fontsize。

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