如何让Silverlight自动调整文本大小以适应容器?

16

我有一个用户控件(如下图),我正在将文本绑定到数据源并实例化一堆用户控件。

我希望文本的大小尽可能大,但仍适合控件的边界。在Windows编程中,我可以通过减小字体大小来测量文本大小,直到它符合目标尺寸。

在Silverlight中有没有这样做的方法?

我知道我可能可以以类似的方式做到这一点,但是否有任何“更好”的方法来完成它呢?

<Grid x:Name="gdBubble" Width="180" Height="95">
    <Ellipse x:Name="elBubble" Fill="#FFFFA300" />
    <TextBlock x:Name="txtContent" Text="{ Binding ClientName }" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>

[我在这里使用网格布局以使文本块正确居中。]

答案如Rich所描述的那样,使用Viewbox。

对于我来说,这是获胜的配置:

<Grid x:Name="gdBubble" Width="180" Height="95">
    <Ellipse x:Name="elBubble" Fill="#FFFFA300" />
    <controls:Viewbox Margin="10,10,10,10" VerticalAlignment="Stretch" Height="Auto">
        <TextBlock x:Name="txtContent" FontSize="18" Text="{ Binding ClientName }" HorizontalAlignment="Center" VerticalAlignment="Center" />
    </controls:Viewbox>
</Grid>

2
我真的很惊讶没有发现其他人有这个问题。难道绑定到包含文本的动态数据源不会出现这个问题吗?文本块只是用于自定义按钮吗? - Tristan Warner-Smith
3个回答

21
昨天有一个类似的问题是关于自动调整内容大小以适应容器大小的。在这种情况下,答案是一样的:使用Viewbox。如果将TextBlock放在Viewbox中,TextBlock将自动调整大小以仅使用所需的空间,而Viewbox将处理将其拉伸到容器的尺寸。使用stretch属性来选择四种拉伸方法之一。
可以看一下昨天的这个线程:WPF Gui that changes size with window?

很好的东西Rich,救了我的一命。+1 :) - Darko

0
尝试使用Dockpanel而不是Grid。使用LastChildFill=true应该可以获得您要查找的行为。

我想让TextBlock填充椭圆形上的所有可用空间,使用DockPanel将在两者之间分配可用区域。 - Tristan Warner-Smith
除非 TextBlock 的尺寸扩展,否则 DockPanel 不会将字体大小扩展到可用空间的最大允许值。我怀疑这很难做到... - Gordon Mackie JoanMiro
如果您将椭圆图形停靠在DockPanel的顶部,则它不应更改大小。然而,Joan关于文本大小不改变的观点仍然存在。 - 17 of 26

0
你有没有研究过 ScaleTransform 变换?
ib.

虽然手动调整大小可能很方便,但我认为这不是答案。 - Tristan Warner-Smith

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