C# 让文本与文本块顶部齐平(我保证不是垂直对齐!)

C# 让文本与文本块顶部齐平(我保证不是垂直对齐!),c#,wpf,xaml,fonts,styles,C#,Wpf,Xaml,Fonts,Styles,我试图让文本与文本块顶部齐平,但没有成功,我总是在文本上方留下几个像素的间隙 字体越大,间距就越大,因此字体大小为12时,间距就不那么明显,但50时,间距就非常明显 链接到图像[ 产生这种情况的代码示例如下: <TextBlock Background="LightCyan" VerticalAlignment="Top" FontSize="12" Text="The quick brown fox"/> <

我试图让文本与文本块顶部齐平,但没有成功,我总是在文本上方留下几个像素的间隙

字体越大,间距就越大,因此字体大小为12时,间距就不那么明显,但50时,间距就非常明显

链接到图像[

产生这种情况的代码示例如下:

<TextBlock Background="LightCyan"
           VerticalAlignment="Top"
           FontSize="12"
           Text="The quick brown fox"/>

<TextBlock Background="Aqua"
           VerticalAlignment="Top"
           FontSize="50"
           Text="The quick brown fox"/>

<TextBlock Background="LightGray"
           VerticalAlignment="Top"
           FontSize="80"
           Text="The quick brown fox"/>

(请原谅缺少错误检查)

基线:字体“所在”的行

大写字母:大写字母的高度

上面的代码基本上会找到从textblock顶部到大写glyph顶部的距离,然后创建一个具有该高度的厚度,以在视图中偏移textblock

注意:我假设大写字母是最高的字符(这并不总是正确的,但对于我来说已经足够好了。你可以遍历文本中的所有字形,找到最高的一个)


在我看来,然后我将TextBlock的边距绑定到GlyphOffset属性,它会适当地偏移文本!(感谢NETscape的边距技巧!)

这似乎是字体的一个属性。为了证明我尝试将两种不同的字体放入Excel单元格(与WPF无关),并查看如何添加边距

结果是:

如您所见,SegoeUI添加了比相同字体大小的Tahoma更大的上边距

将其描述为上升高度:

Microsoft描述了OpenType™ 高度属性

所以,是的,它是特定字体的内置属性

编辑: 我尝试了不同的解决方案,将文本块上的边距设置为负边距可以简单地工作,并按照您的要求保留行高

<TextBlock 
  Text="This is a test with wrap" 
  TextWrapping="Wrap" 
  FontFamily="SegoeUI" 
  FontSize="70" 
  Margin="0, -12, 0, 0"/>


您可以将边距属性绑定到一个计算,该计算使用所用字体的字体度量,使其以不同的大小工作。

我刚才也这么说。字体带有内置的边距。那么,您的答案是不可能实现它们想要的吗?来吧,这是WPF:)只是为了完成。此问题not只影响WPF:-)他可能会用你使用负边距的方法来调整它,但这在很大程度上取决于使用的字体和字体大小。一种可能更通用的方法是从当前使用的字体中检索高度属性,并反向计算要使用的负边距以消除它。谢谢大家,你的帮助真的令人敬畏ome,特别是BlueM和NETscape!我也设法找到了这个问题:在你们的帮助下,这个问题的帮助下,我实现了一个相当简单的小解决方案,它似乎适用于不同的字体和大小。我将用我的操作更新这个问题。再次感谢各位,你们真的救了我的命!我很确定不会以下是photoshop示例中涉及的后期处理。在自然状态下,所有字体都有一定程度的边距。间距取决于字体大小这一事实支持了这一点theory@Bas我编辑了我的答案,因为我惊讶于文本块上有可能出现负边距。@BlueM,我对此感到非常惊讶也有可能,但效果很好!再次感谢你的巧妙想法!
<TextBlock 
  Text="This is a test with wrap" 
  TextWrapping="Wrap" 
  FontFamily="SegoeUI" 
  FontSize="70" 
  Margin="0, -12, 0, 0"/>