我使用FormattedText呈现文本,但似乎确实有任何方法可以在呈现的输出上执行按字符命中测试。它是只读的,所以我基本上只需要选择,不需要编辑。
我会使用RichTextBox或类似的代码,但我需要根据文本本身中嵌入的控制代码来输出文本,这样它们就不会总是嵌套,这使得构建正确的内联元素非常复杂。我还有点担心该解决方案的性能;我有大量的行,并且经常附加新行。
我看过GlyphRun,似乎我可以从它或相关的类中获得命中测试,但我会重新实现许多功能,似乎应该有一个更简单的方法……
有没有人知道实现这一点的好方法?
发布于 2009-02-12 04:44:51
最好的方法是设计一个好的数据结构来存储你的文本,同时也要考虑命中测试。一个例子是将文本拆分成块(单词、行或段落,取决于您需要的内容)。那么每个这样的块都应该有一个边界框,在任何格式化操作中都应该重新计算边界框。在你的设计中还要考虑插入符号的位置。
一旦你有了这样的工具,做命中测试就变得非常容易,只需使用边界框即可。它还将有助于后续操作,如突出显示文本的特定部分。
发布于 2011-07-27 13:31:27
您可以从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++;
}在OnRender中,可以渲染这些几何体对象,而不是格式化文本。
发布于 2009-02-12 08:15:38
完全同意Sesh的观点--不重新实现整个FormattedText功能的最简单方法是将你想要命中测试的各个项目拆分到它们自己的控件/内联中。
考虑使用TextBlock并将每个单词添加为它自己的内联(或),然后绑定到内联的IsMouseDirectlyOver属性,我们的add委托给MouseEnter & MouseLeave事件。
如果你想对实际的字形进行像素级的点击测试(即鼠标恰好在这个‘i’的点上),那么你需要使用GlyphRuns并对字形进行手动点击测试(阅读:困难的工作)。
https://stackoverflow.com/questions/540002
复制相似问题