对 FormattedText 执行命中测试的好方法是什么?

Eri*_*ric 1 c# wpf text hittest

我正在使用 渲染文本FormattedText,但似乎确实有任何方法可以对渲染的输出执行每个字符的命中测试。它是只读的,所以我基本上只需要选择,不需要编辑。

我会使用RichTextBox或类似的,但我需要根据嵌入文本本身的控制代码输出文本,因此它们并不总是嵌套,这使得构建正确的内联元素非常复杂。我也有点担心该解决方案的性能;我有大量的行,并且经常添加新行。

我看过GlyphRun,看来我可以从它或相关的类中进行命中测试,但我会重新实现很多功能,而且似乎应该有一种更简单的方法......

有谁知道实现这个的好方法?

jus*_*ase 5

您可以从 FormattedText 对象获取每个字符的几何形状,并使用每个字符的边界进行命中测试。

var geometry = (GeometryGroup)((GeometryGroup)text.BuildGeometry(new Point(0, 0))).Children[0];
foreach (var c in geometry.Children)
{
  if (c.Bounds.Contains(point))
    return index;
  index++;
}
Run Code Online (Sandbox Code Playgroud)

在 OnRender 中,您可以渲染这些几何对象而不是格式化文本。