WPF TextBlock中的文本垂直对齐

267

如何将TextBlock内的文本竖直居中对齐?我找到了TextAlignment属性,但它只能控制文本水平对齐方式。那么如何进行竖直方向上的文本对齐呢?


@shr 和其他人:请注意,TextAlignment 只影响水平对齐,而不是垂直对齐(正如问题所指)。 - Drew Noakes
17个回答

328

一个Textblock本身无法进行垂直对齐。

我发现最好的方法是将Textblock放入边框中,这样边框就可以为您实现对齐。

<Border BorderBrush="{x:Null}" Height="50">
    <TextBlock TextWrapping="Wrap" Text="Some Text" VerticalAlignment="Center"/>
</Border>

注意: 这在功能上等同于使用网格,只是取决于您希望控件如何与布局结合,哪种方法更适合。


29
边框的高度必须设置才能生效垂直对齐。 - Tim Lloyd
26
此外,TextBlock 不能指定高度,否则它将无法垂直居中。 - pearcewg
21
@gav - TextAlignment仅适用于水平对齐...问题是关于垂直对齐的。 - Orion Edwards
@TimLloyd - 我不确定这总是正确的。我有这个设置,边框高度为“自动”,它运行良好。它在具有星号行高度(以及行中其他内容)的网格单元中。 - Bob Sammers

115

虽然Orion Edwards的回答适用于任何情况,但每次想要添加边框并设置边框属性时可能会很麻烦。另一种快速方法是设置文本块的填充:

<TextBlock Height="22" Padding="3" />

14
我认为这是最杰出的答案。 - Boppity Bop
2
这只有在字体大小为16px时才有效,不是吗? - C4d
1
被接受的答案可以正确地垂直对齐 TextBox 的实际边框,但它似乎对文本本身没有影响...我相信这正是提问者的意图。此解决方案可代替 TextVerticalAlignment 属性,并获得我的点赞 :) - Trekkie
2
区块内的动态内容怎么办?2或5行不需要不同的填充吗?还有10pt与24pt字体。 - Reahreic
1
这可能是非动态大小文本块的最直接的解决方案。 - Connell Hagen

68

文本块不支持垂直文本对齐。

我通过使用Grid包装文本块,并设置HorizontalAlignment="Stretch"和VerticalAlignment="Center"来解决此问题。

像这样:

<Grid>
    <TextBlock 
        HorizontalAlignment="Stretch"
        VerticalAlignment="Center"
        Text="Your text" />
</Grid>

+1 不需要像基于边框的方法那样设置网格的高度。 - Efran Cobisi
我发现这种方法对我来说效果最好。我正在创建动态指示灯,通过在Grid内覆盖Ellipse上的TextBlock来实现。无需绑定宽度和高度属性或进行任何棘手的操作。 - paddy

17

你可以使用标签(label)替代文本块(textblock)。

<Label Content="Hello, World!">
    <Label.LayoutTransform>
        <RotateTransform Angle="270"/>
    </Label.LayoutTransform>
</Label>

3
好的,该标签具有VerticalContentAlignment属性。太棒了!+1 - Ignacio Soler Garcia
4
不清楚原帖作者是否需要使用TextBlock,或者能否使用Label达到目的。对于我所需的情况,使用Label可以满足要求。+1 - Steve Kalemkiewicz
21
这回答了如何产生垂直文本的问题,而不是如何应用垂直对齐! - Sebastian Negraszus
26
此问题正在 Meta 上进行讨论:http://meta.stackoverflow.com/questions/305572/is-there-some-backstory-to-this-highly-upvoted-wrong-answer?cb=1 - NathanOliver

12

TextBlock不支持垂直对齐其内容。如果您必须使用TextBlock,则必须相对于其父级进行对齐。

但是,如果您可以使用Label(它们确实具有非常相似的功能),则可以定位文本内容:

<Label VerticalContentAlignment="Center" HorizontalContentAlignment="Center">
   I am centred text!
</Label>

Label 默认会拉伸以填满其边界,这意味着标签的文本将居中对齐。


对我来说,Textblock问题的唯一合理解决方案。谢谢你的提示! - Dr.Escher

8

如果您可以不使用文本包装,我认为用标签替换TextBlock是最简洁的方法。否则,请按照其他有效答案之一操作。

<Label Content="Some Text" VerticalAlignment="Center"/>

4

要实现您所说的内容,最好的方法是创建一个支持VerticalContentAlignment的标签。

然后,如果您真的需要一些Label不支持的TextBlock属性,比如TextWrapping,可以将一个TextBlock放在Label内部。

这样可以同时满足您的两个需求:VerticalContentAlignmentTextWrapping

<Label
   VerticalContentAlignment="Center">
   <TextBlock
             TextWrapping="WrapWithOverflow">
             My text goes here!
   </TextBlock> 
<Label/>

3
对我而言,VerticalAlignment="Center"可以解决这个问题。
可能是因为TextBlock被包含在一个网格中,但在wpf中几乎所有的东西都是如此。

2
在我的案例中,我这样做是为了让 TextBlock 显示更加美观。
<Border BorderThickness="3" BorderBrush="Yellow" CornerRadius="10" Padding="2"
    HorizontalAlignment="Center" VerticalAlignment="Center" Height="30" Width="150">
        <TextBlock FontSize="20" Height="23" HorizontalAlignment="Left" Margin="0,0,0,-5" Text="" VerticalAlignment="Top" Width="141" Background="White" />
</Border>

让文本离底部更远的技巧是设置:
Margin="0,0,0,-5"

1

我发现修改文本框样式(即controltemplate)并将PART_ContentHost的垂直对齐方式更改为中心对齐会解决问题。


OP正在询问TextBlocks的相关问题。它们没有ControlTemplates。 - ANeves

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