xaml - 垂直居中文本(TextBlock)

标签 xaml uwp

我正在努力使用 TextBlock 使文本垂直居中。我知道如果您使用重音符号,它会在空格上方添加额外的空格但为什么它与下面的空格不一致?有一些额外的像素。

bad vertically center image

<StackPanel Orientation="Horizontal" VerticalAlignment="Top" HorizontalAlignment="Center" Margin="0,40,0,0" Background="#FF191919" BorderThickness="1" BorderBrush="#FFBF0077">
    <Grid Width="41" HorizontalAlignment="Left" Padding="0" BorderThickness="0,0,1,0" BorderBrush="#FFBF0077">
        <TextBlock x:Name="TextBlockLocalScore" Text="0" FontFamily="Courier New" Foreground="#FF007AFF" TextAlignment="Center" VerticalAlignment="Center" HorizontalAlignment="Center" />
    </Grid>
    <Grid Padding="4,8" BorderThickness="8,0" Width="104">
        <TextBlock x:Name="TextBlockMinutesLeft" Text="00" HorizontalAlignment="Left" FontSize="36" VerticalAlignment="Center" FontFamily="Segoe UI Light" FontWeight="Light" TextAlignment="Center" Height="27" TextLineBounds="Tight" Margin="0,0,4,0" />
        <TextBlock x:Name="TextBlockSecondsLeft" Text="30" HorizontalAlignment="Right" FontSize="36" VerticalAlignment="Center" FontFamily="Segoe UI Light" FontWeight="Light" OpticalMarginAlignment="TrimSideBearings" TextAlignment="Center" Height="27" TextLineBounds="Tight" />
    </Grid>
    <Grid Width="41" HorizontalAlignment="Right" Padding="0,8" BorderThickness="1,0,0,0" BorderBrush="#FFBF0077">
        <TextBlock x:Name="TextBlockRemoteScore"  Text="0" HorizontalAlignment="Center" FontSize="36" VerticalAlignment="Center" FontFamily="Segoe UI Light" FontWeight="Light" OpticalMarginAlignment="TrimSideBearings" TextAlignment="Center" Height="27" TextLineBounds="Tight" Foreground="#FFFF3B30" />
    </Grid>
</StackPanel>

我已经玩过行高和文本行边界,但我不明白为什么要在更改字体后使文本仍然垂直居中。

更新了代码以重现问题:

<StackPanel Orientation="Horizontal" VerticalAlignment="Top" HorizontalAlignment="Center" Margin="0,100,0,0" Background="#FF191919" BorderThickness="1" BorderBrush="#FFBF0077">
    <Grid Width="51" HorizontalAlignment="Left" Padding="0" BorderThickness="0,0,1,0" BorderBrush="#FFBF0077">
        <TextBlock Text="0" FontFamily="Courier New" FontSize="36" Foreground="#FF007AFF" TextAlignment="Center" VerticalAlignment="Center" HorizontalAlignment="Center" />
    </Grid>
    <StackPanel Padding="4" BorderThickness="8,0" Orientation="Horizontal">
        <TextBlock Text="01" FontFamily="Courier New" FontSize="36" TextAlignment="Left" VerticalAlignment="Center" Margin="0,0,4,0" />
        <TextBlock Text="11" FontFamily="Courier New" FontSize="36" TextAlignment="Right" VerticalAlignment="Center" />
    </StackPanel>
    <Grid Width="51" HorizontalAlignment="Right" Padding="0,8" BorderThickness="1,0,0,0" BorderBrush="#FFBF0077">
        <TextBlock Text="0" FontFamily="Courier New" FontSize="36" Foreground="#FF007AFF" TextAlignment="Center" VerticalAlignment="Center" HorizontalAlignment="Center" />
    </Grid>
</StackPanel>

最佳答案

您应该尝试一下这两个属性。就您而言,您可能对 TextLineBounds 更感兴趣.

<TextBlock Text="80" FontSize="40" TextLineBounds="Tight" OpticalMarginAlignment="TrimSideBearings" />

更新

我不确定您的屏幕截图是否 100% 准确。我使用你的代码生成了以下图片。请注意,我已将它们放大了 10 倍。

<Grid Width="41" HorizontalAlignment="Left" Padding="0" BorderThickness="0,0,1,0" BorderBrush="#FFBF0077">
    <TextBlock x:Name="TextBlockLocalScore" TextLineBounds="Full" Text="80" FontFamily="Courier New" FontSize="36" Foreground="#FF007AFF" TextAlignment="Center" VerticalAlignment="Center" HorizontalAlignment="Center" />
    <Rectangle UseLayoutRounding="False" HorizontalAlignment="Center" Fill="White" Height="10" VerticalAlignment="Top" Width="1" Margin="-21,0,0,0" />
    <Rectangle UseLayoutRounding="False" HorizontalAlignment="Center" Fill="White" Height="10" VerticalAlignment="Bottom" Width="1" Margin="-21,0,0,0" />
</Grid>

TextLineBounds 设置为 Tight

enter image description here

TextLineBounds 设置为 Full

enter image description here

是的,在第一个上,数字 8 的底边与 Line 之间仍然有一个微小的间隙(大约 0.3 epx) code>,但这主要是由于 layout roundingeffective pixel snapping 。我认为人眼无法察觉。 :)

P.S.您不能纯粹依赖于检查 Blend Designer 中的视觉效果,因为有时画板不会及时更新,无法为您提供正确的结果。您应该始终运行您的应用并从那里进行检查。

关于xaml - 垂直居中文本(TextBlock),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45338530/

相关文章:

c# - 将 TextBox 多绑定(bind)值绑定(bind)到另一个属性

xaml - 包含 GridView 和 ListView 的 ListView

c# - Azure - 推送通知 - 无法发送测试消息

c# - 从 Windows Phone UWP 的 WriteableBitmap 创建 BitmapDecoder 的异常

.net - MAUI 和 Uno 平台有什么区别?

全息镜头中的 C++ dll

c# - 删除按钮 wpf 上的蓝色突出显示

c# - TextBlock 中接受转义字符的等效 HTML 代码

c# - 如何在 MahApps.Metro 中创建自定义口音?

c# - UWP usb检测