我正在尝试使用FormattedText.BuildGeometry来确定字符的布局方式,以确定鼠标的逻辑位置。在我的上下文中,FormattedText可以假设为单行 - 我应该得到一个包含1个子元素的几何组,每个子元素都有一个子几何。这是正确的,除了对于字符“f”和“t”,重复FormattedText文本中的字符将导致该行上的几何数量比文本中的字符数少一个。
示例代码:
var tf = new Typeface(new FontFamily("Calibri"), FontStyles.Normal, FontWeights.Normal, FontStretches.Normal);
var ft = new FormattedText("ff", CultureInfo.CurrentCulture, FlowDirection.LeftToRight, tf, 14, Brushes.Black);
var g = ft.BuildGeometry(new Point(0, 0));
var gc = (GeometryGroup)((GeometryGroup)g).Children[0];
Debug.Assert(gc.Children.Count == ft.Text.Length, "Expected length of " + ft.Text.Length + " but found " + gc.Children.Count);
您可以将其附加到空WPF应用程序中的按钮。
对于包含“ff”或“tt”的任何内容都会失败。更改字体会更改行为 - 某些字体我找不到导致此问题的字符。
答案 0 :(得分:2)
简短的回答是BuildGeometry
在glyphs中思考,而不是字符。来自documentation(强调我的):
返回表示格式化文本的Geometry对象,包括所有字形和文本装饰。
在几种字体中," ff"和" tt"是ligatures,因此它们由单个字形表示。
有关如何按照自己的意愿行事的说明,请参阅this question。基本上,BuildHighlightGeometry(Point, int, int)
可以返回单个字符的边界框。您可以遍历边界框并执行命中测试,直到找到匹配的字符。