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会渲染与文本区域顶部正确对齐的相同字体。
是否有人对造成差距的原因以及如何消除差距有任何想法?
这是我尝试过的一些方法:
将VerticalAlignment设置为顶部
将LineStackingStrategy设置为“ BlockLineHeight ”,并将LineHeight值设置为Font size的值。(虽然这似乎有很大帮助,但这会影响所有文本行(如果是多行的话)。我希望可以找到一个仅影响顶部空间的解决方案。)
在自定义类中呈现文本。(我真的想避免这样做,因为我必须重新创建TextBlock的所有功能。)
编辑:
万一其他人需要它,在BlueM和NETscape的帮助下,还有这个非常方便的链接: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,这个技巧!)
这似乎是字体的属性。为了证明我试图将两种不同的字体放入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属性绑定到一个计算,该计算使用所用字体的字体规格来使其以不同大小工作。