在Grid中,WPF TextBlock字体大小调整以填充可用空间

63

我有一些在运行时以文本块形式显示的文字。我希望字体大小能够最大化以填满给定的区域。我认为我已经正确设置了文本块的“自动调整大小”,并尝试增加字体大小直到文本块大于其父级,然后将字体大小减小1。问题是我无法使控件重新绘制/重新计算其大小。

有更好的方法吗?或者我可以让我的方法工作吗?

7个回答

89

TextBlock 放入 ViewBox 中:

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

9
如何让内容在竖直方向上也占据全部空间?我不能减小文本块的字体大小来实现文字自动换行。 - Tobia
这只是使文本延伸到其所在区域的高度;使其最终变得非常巨大。而且换行从未起作用,它继续流出我的控件的右边缘。 - BrainSlugs83
6
被踩了,除非设置文本块的宽度,否则文本换行功能无法与视图框(viewbox)一起使用,这破坏了视图框的整个理念。 - Matt
实际上,你的反对票毫无意义 :) 如果你没有给他界限,你的应用程序会如何知道在何时/何处进行裁剪?实际上,viewbox并不改变尺寸,它根据内容动态调整大小,所以你必须固定它。不要忘记你可以同时使用这两种技术,并在viewbox中设置文本块的宽度和高度。你也可以在Textblock的尺寸上使用绑定,但这可能会有点复杂 x) - Axel Samyn

40

我也遇到了同样的问题。你可以使用这个方法 调整 文本块字体大小,当它出现溢出时,以填充区域。


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


5
哇,我花了好几个小时用Measure方法和Width、ActualWidth、RenderWidth尝试解决一个类似的问题,但都没有成功哈哈哈哈哈。我永远不会发现"DownOnly"属性,谢谢! :) - Sergio0694
2
如果您希望字体变窄而不是变小,可以将Stretch值更改为Fill。 - Otto Abnormalverbraucher

12

WPF的ViewBox控件可以根据其内容自适应调整大小以适应可用空间。

只需将您的TextBlock放置在ViewBox中,如下所示:

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

ViewBox 通常会根据其容器进行缩放。


11

我发现使用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>

3

好的,这不是一个“完美”的答案,但这是一个快速的技巧(你可以将其放入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>
会扩大任何内容以填充其容器。问题是< TextBlock >尽管它会根据文本大小自动调整大小,但有顶部和底部的填充无法消除(除非进行一些较重的工作)。这可能会让你更接近你想要的效果,但仍需要注意。

2
为了保证换行,您需要设置 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."/>


2
设置文本块的宽度或高度会使视图框无用。视图框的整个理念是为了适应不断变化的屏幕尺寸/分辨率。如果您知道屏幕的实际空间,根本不需要视图框。 - Matt

0

我发现了一种相当不错的折中方案,可以使用Viewbox,同时保持文本换行。

只需将<ContentControl>和x:Type ContentControl替换为Button、Grid或您需要的任何具有固定大小且为父级的控件即可。

<ContentControl>
    <Viewbox Stretch="Uniform" StretchDirection="DownOnly">
        <TextBlock Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentControl}}, Path=ActualWidth}" TextWrapping="WrapWithOverflow">some long random Text to be fitted</TextBlock>
    </Viewbox>
</ContentControl>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接