【问题标题】:How to vertically center a wingding character in textblock xaml / C# / UWP如何在文本块 xaml / C# / UWP 中垂直居中一个侧翼字符
【发布时间】:2017-04-30 09:53:44
【问题描述】:

我正在尝试将 Wingdings 符号用作控件中的图形,并尝试使其在文本框(UWP 应用程序)中垂直居中。我在它周围放置了一个可见的边界,并且该符号是不垂直居中很明显,破坏了我的目标。如果可能的话,它可以让我不必做定制艺术,而且由于 Wingdings 可以调整大小,我的图形可以很容易地重新调整大小。这就是为什么我不想手动调整高度直到它看起来居中。

大多数 Wingdings 不是垂直居中的,但有时用作图形,所以我想知道这是否可以通过合理的努力实现。一种巧妙的 xaml 方法是理想的,但字体度量测量然后文本块高度调整大头钉会很好。

这是一个问题的例子。硬盘驱动器符号不在边框中垂直居中。

    <Border BorderBrush="Black" BorderThickness="10"  Background="White" HorizontalAlignment="Center" VerticalAlignment="Center">
        <TextBlock Text="&#x3b;" FontFamily="Wingdings" FontSize="230"/>
    </Border>

编辑 - 将示例更改为整理并使用 Wingdings 硬盘驱动器符号,因为头骨和骨头足够接近垂直居中以混淆问题。驱动器符号很明显不是垂直居中的。我的目标是在字体大小发生变化时自动垂直居中。我可以看到 XAML 可能无法做到这一点,但我想知道是否存在一些我可以使用的字体/文本指标查询。

编辑 2 - 添加图片(来自上面的 XAML,与所有建议的 XAML 具有相同的问题:

我试图让符号的中心位于文本块的中心

【问题讨论】:

    标签: c# xaml uwp uwp-xaml


    【解决方案1】:

    头骨和骨骼不在边框中垂直居中。

    实际上默认情况下,骷髅和骨头文本应该是垂直居中的。为什么你的代码使它看起来不是垂直的原因是字体太大而不能在边框内,因为边框的高度被限制为200。所以TextBlock的超出部分你不会看到它可能看起来不是垂直居中的。

    如何在文本块 xaml / C# / UWP 中将侧翼字符垂直居中

    有几种方法可以做到这一点,选择哪种方式取决于你的喜好。

    1. 删除Border 控件的高度和宽度属性,您将看到文本垂直居中。

      <Border BorderBrush="Black" BorderThickness="10" Background="White"  HorizontalAlignment="Center"> 
         <TextBlock x:Name="textBlock"   Text="N" FontFamily="Wingdings"  FontSize="230"  />
      </Border>
      
    2. TextBlock控件之外添加一个ViewBox控件。 ViewBox 可以拉伸和缩放单个孩子以填充可用空间。这将使您的文本看起来始终居中,无论字体大小有多大。文本大小将取决于Border 控件的大小。代码如下:

      <Border BorderBrush="Black" BorderThickness="10" Height="200" Width="175" Background="White" >
       <Viewbox>
           <TextBlock x:Name="textBlock"   Text="N" FontFamily="Wingdings"  FontSize="230"  />
       </Viewbox>
      </Border>
      
    3. 只需使用TextBox 控件而不是BorderTextBlock 的组件。这将达到使文本始终居中的相同效果,无论字体大小如何。注意不要为TextBox 设置固定的高度和宽度,还要使TextBox 只读。代码如下:

      <TextBox
        x:Name="textBox"
        HorizontalAlignment="Center"
        VerticalAlignment="Center"    
        BorderBrush="Black"
        BorderThickness="10"
        FontFamily="Wingdings"
        FontSize="230"
        IsReadOnly="True"
        Text="N"
        TextAlignment="Center" />
      

    【讨论】:

    • 感谢 Sunteen,您的第一个答案似乎缺少 VerticalAlignment="Center" 但 1,2 或 3 中的字符都不是垂直居中的。我用头骨和骨头选了一个不好的例子,因为它不是垂直对称的。如果将字符更改为“µ”并测量符号的顶部和底部边界之间的像素,您会看到它在上述任何建议中都不是垂直居中的。我不认为 font-char 是垂直居中的。举个极端的例子,看看“;”这绝对不是垂直居中的。是否有字体/文本度量方法可以做到这一点?
    • @br0therDave 我已经测试过“µ” ,这三种方法都可以使其居中。如果仍有问题,请提供您的应用目标版本和测试环境。并提供上面代码得到的截图。
    • 我在问题中添加了一张图片。您可以看到wingdings 符号的中心不在文本块的垂直中心。关于如何使符号垂直居中的任何想法?
    猜你喜欢
    • 2018-04-26
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多