WPF TextBlock 字体调整大小以填充网格中的可用空间

Posted

技术标签:

【中文标题】WPF TextBlock 字体调整大小以填充网格中的可用空间【英文标题】:WPF TextBlock font resize to fill available space in a Grid 【发布时间】:2011-01-17 23:13:04 【问题描述】:

我有一些文本在运行时显示在文本块中。我想要 字体大小最大可以填充该区域 给定的。我想我已经正确设置了文本块以“自动调整大小”并且 我尝试增加字体大小,直到文本块大于 然后它的父级将字体大小减小 1。问题是我不能 让控件重绘/重新计算其大小。

有更好的方法吗?或者有什么方法可以让我的方法起作用?

【问题讨论】:

【参考方案1】:

TextBlock 包裹在ViewBox 中:

   <Grid>
    <Viewbox>
        <TextBlock TextWrapping="Wrap" Text="Some Text" />
    </Viewbox>
   </Grid>

【讨论】:

这填充了所有水平空间......但是如何对垂直空间也做同样的事情?在文本块文本变得非常小的字体大小之前,我无法换行。 这只是让文本拉伸到它所在区域的高度;使它最终变得巨大。并且包装从来没有踢过它,它继续从我控制的右边缘流出。 否决,Textwrapping 不适用于 viewbox,除非设置了文本块的宽度,这会破坏 viewbox 的整个想法。 实际上,您的否决票毫无意义:) 如果您不给他任何限制,您的应用程序如何知道何时/何处进行裁剪?实际上,viewbox 不固定尺寸,它会根据内容动态调整,这就是您必须修复它的原因。不要忘记您可以使用这两种技术并在视图框中设置文本块的宽度和长度。您也可以在 Textblock 的尺寸上使用 à 绑定,但这可能会变得有点复杂 x)【参考方案2】:

我遇到了同样的问题。您可以使用它来resize textblockfontsize 以在 overflow 时填充该区域。 p>


<Viewbox StretchDirection="DownOnly" Stretch="Uniform">
    <TextBlock Text="Binding Path=Title" HorizontalAlignment="Center"/>
</Viewbox>

【讨论】:

哇,我花了几个小时试图使用 Measure 方法和 Width、ActualWidth、RenderWidth 找到类似问题的解决方案,但没有任何效果啊哈哈哈哈我从来没有发现“DownOnly”属性,谢谢你! :) 如果您希望字体变窄而不是变小,可以将“拉伸”值更改为“填充”。【参考方案3】:

WPF ViewBox 控件可以随其内容增长/收缩到可用空间。

只需将您的 TextBlock 放在 ViewBox 中即可;

<Viewbox Stretch="Uniform" Width="50" Height="50">
    <TextBlock Text="Test" />
</Viewbox>

ViewBox 通常由其容器缩放。

【讨论】:

【参考方案4】:

我找到了使用ViewBox 的好方法:

 <Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
        <RowDefinition Height="50" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="100" />
    </Grid.ColumnDefinitions>
    <Viewbox Grid.Row="0" Grid.Column="0" Stretch="Uniform">
        <TextBlock Name="tbTest" Background="Yellow" Text="This is some text" />    
    </Viewbox>

    <ContentControl Grid.Column="0" Grid.Row="2">
        <TextBlock>This is some text</TextBlock>
    </ContentControl>
</Grid>

【讨论】:

【参考方案5】:

嗯,它不是一个“完美”的答案,但这是一个快速的 hack(你可以将它放到 kaxaml 中并进行测试):

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Grid Height="300" Background="green">  
  <Viewbox>
  <TextBlock Background="red" Text="Hurr"/>
  </Viewbox>
  </Grid>
</Page>

ViewBox 将放大任何内容以填充其容器。问题是TextBlock,虽然它的大小适合其文本,但在顶部和底部都有您无法摆脱的填充(无需做一些繁重的工作)。这可能会让你更接近你想要的。

【讨论】:

【参考方案6】:

为确保换行,您需要设置TextBlockMaxWidth 和/或MaxHeight

<Viewbox StretchDirection="DownOnly" Stretch="Uniform">
      <TextBlock  MaxWidth="500" TextWrapping="Wrap" FontSize="30" VerticalAlignment="Center"
                  Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."/>

【讨论】:

设置文本块的宽度或高度会使视图框无用。 viewbox 的整个想法是适应不断变化的屏幕尺寸/分辨率。如果您知道屏幕空间,则根本不需要视图框

以上是关于WPF TextBlock 字体调整大小以填充网格中的可用空间的主要内容,如果未能解决你的问题,请参考以下文章

如何将 TextBlock(字体大小)增大/缩小到 WPF 中的可用空间?

WPF如何改变GridView字体大小

如何设置数据网格列以填充数据网格集以填充和布局自动调整大小的网格?

如果它比 WPF XAML 中的窗口大,如何缩放字体大小以适应窗口?

如何使wpf数据网格填充所有可用空间并使用窗口调整大小?

StackPanel 内的 WPF ViewBox