我试图使用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”的任何内容,此操作均失败。更改字体会改变行为-有些字体我还没有找到引起这种情况的字符。
最佳答案
简短的答案是BuildGeometry
用glyphs而不是字符来思考。从documentation(重点是我):
返回一个Geometry对象,该对象表示格式化的文本,包括所有字形和文本修饰。
在几种字体中,“ ff”和“ tt”为ligatures,因此它们由单个字形表示。
请参阅this question以获取有关如何执行所需操作的说明。基本上,BuildHighlightGeometry(Point, int, int)
可以返回单个字符的边界框。您可以遍历边界框并执行命中测试,直到找到匹配的字符。
关于c# - FormattedText.BuildGeometry删除字符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9425725/