使文本与TextBlock顶部齐平放置(我保证,不是VerticalAlignment!)

Bas*_*Bas 3 c# wpf fonts xaml styles

我试图使文本与TextBlock顶部齐平,但没有成功,我总是在文本上方留有几个像素的空隙。

字体越大,间距越大,因此在说12的字体大小上并不是很明显,但是50的大小使其非常明显

链接到图片[ http://i.stack.imgur.com/dJFVY.png]

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

<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"/>
Run Code Online (Sandbox Code Playgroud)

我也不认为它的Font本身有问题,例如photoshop会渲染与文本区域顶部正确对齐的相同字体。

是否有人对造成差距的原因以及如何消除差距有任何想法?

这是我尝试过的一些方法:

  1. 将VerticalAlignment设置为顶部

  2. LineStackingStrategy设置为“ BlockLineHeight ”,并将LineHeight值设置为Font size的值。(虽然这似乎有很大帮助,但这会影响所有文本行(如果是多行的话)。我希望可以找到一个仅影响顶部空间的解决方案。)

  3. 在自定义类中呈现文本。(我真的想避免这样做,因为我必须重新创建TextBlock的所有功能。)

编辑:

万一其他人需要它,在BlueMNETscape的帮助下,还有这个非常方便的链接:TextBlock像大写字母一样大(忽略字体升序/降序)G。Sofien有一个很酷的解决方案,我使用他们的所有想法实现了这一点:

在我的代码后面,我已经有一个代表我的文本的对象(用于拖放式程序)。在它的构造函数中,我添加了以下代码:

  Typeface typeface = new Typeface(Font_Family, Font_Style, Font_Weight, new FontStretch());
  GlyphTypeface glyphTypeface;

  typeface.TryGetGlyphTypeface( out glyphTypeface );

  double baseline = glyphTypeface.Baseline * Font_Size;
  double capsHeight = glyphTypeface.CapsHeight Font_Size;
  double glyphOffset = -1 * (baseline - capsHeight);

  GlyphOffset = new Thickness(0, glyphOffset, 0, 0);
Run Code Online (Sandbox Code Playgroud)

(原谅缺少错误检查)

基线:字体“坐”的行。

CapsHeight:大写字母的高度。

上面的代码基本上将找到从文本块顶部到大写字形顶部的距离,然后创建一个具有该高度的Thickness以在视图中偏移文本块。

注意:我假设大写字母是最高的字符(这并不总是正确的,但足以满足我的目的。您可以遍历文本中的所有字形并找到最高的字符)

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

Blu*_*ueM 5

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

结果如下:

在此处输入图片说明

如您所见,与相同字体大小的Tahoma相比,Segoe UI的上边距更大。

维基百科将此描述为上升高度

在此处输入图片说明

Microsoft在此处描述了OpenType™高度属性。

在此处输入图片说明

因此,是的,它是该特定字体的内置属性。

编辑:我尝试了不同的解决方案,并将TextBlock上的边距设置为负边距只是可以正常工作并按您的要求保留行高。

<TextBlock 
  Text="This is a test with wrap" 
  TextWrapping="Wrap" 
  FontFamily="SegoeUI" 
  FontSize="70" 
  Margin="0, -12, 0, 0"/>
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

您可以将Margin属性绑定到一个计算,该计算使用所用字体的字体规格来使其以不同大小工作。