FormattedText.BuildGeometry删除字符

本文关键字:字符 删除 BuildGeometry FormattedText | 更新日期: 2023-09-27 18:25:34

我正在尝试使用FormattedText.BuildGeometry来确定字符的布局,以便确定鼠标的逻辑位置。在我的上下文中,可以假设FormattedText是一行——我应该得到一个有1个子几何体的几何体组,每个字符都有一个子几何体。这是真的,除了字符"f"answers"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"的任何内容,此操作都将失败。更改字体会改变行为——有些字体我还没有找到导致这种情况的字符。

FormattedText.BuildGeometry删除字符

简单的答案是BuildGeometry是用字形思考的,而不是字符。来自文件(强调矿):

返回表示格式化文本的Geometry对象,包括所有字形和文本装饰。

在几种字体中,"ff"answers"tt"是连字,因此它们由一个字形表示。

请参阅此问题,了解如何按照自己的意愿行事。基本上,BuildHighlightGeometry(Point, int, int)可以返回单个字符的边界框。您可以迭代边界框并执行命中测试,直到找到匹配的字符。