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

Posted

技术标签:

【中文标题】如何让 WPF TextBlock 在多行上显示我的文本?【英文标题】:How do I make a WPF TextBlock show my text on multiple lines? 【发布时间】:2011-11-16 10:39:30 【问题描述】:

我有一个 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%)并换行成多行,具体取决于我有多少文本。我附上了到目前为止的代码......我错过了那个副标题的东西,不知道是什么。干杯

编辑 基本上我想要实现的是子标题包装文本,因此它可以向下扩展它,字体占标题的 70% - 无论字体有多大。

【问题讨论】:

动态调整大小的规则/方程式是什么。好的 sub 是 70% 但如何调整第一个的大小?如果您想要第二个 TextBlock 的固定宽度,请设置 Width。 这适用于我不知道屏幕尺寸/分辨率的环境。所以宽度是使用边距设置的,因此我可以在所有屏幕上表现相同。标题的大小由视口决定,这意味着文本块总是以最大尺寸显示。 - 再次取决于屏幕分辨率。 【参考方案1】:

嵌套堆栈面板会导致文本框正确换行:

<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>

【讨论】:

这能解决您的问题吗?固定宽度和固定正面尺寸似乎与问题陈述不一致。 @Blam - 如果您希望文本换行,您可以使用 MaxWidth 代替,但如果它小于宽度,则不希望有多余的空间。【参考方案2】:

使用TextBlock元素的属性TextWrapping

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

【讨论】:

【参考方案3】:

使用换行符:

<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

【讨论】:

【参考方案4】:

这就到了那里。没有 ActualFontSize 属性,但有一个 ActualHeight 并且与 FontSize 相关。现在这只是原始渲染的大小。我不知道如何将转换器注册为调整大小事件。实际上可能需要将 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();
        
     

【讨论】:

【参考方案5】:

如果你只是想让你的标题字体比其他字体大一点,你可以使用 ScaleTransform。所以你不依赖于真正的字体大小。

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

【讨论】:

以上是关于如何让 WPF TextBlock 在多行上显示我的文本?的主要内容,如果未能解决你的问题,请参考以下文章

如何使悬停信息气泡出现在 WPF 中的鼠标悬停上?

WPF:如何使 RichTextBox 看起来像 TextBlock?

WPF TextBlock 仅在所有工作完成后才显示所有日志消息

在TextBlock WPF / Xaml中展开/缩小符号

WPF实现滚动显示的TextBlock

如何将多行从一个网格视图移动到另一个 | WPF