首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在FormattedText上执行命中测试的好方法是什么?

在FormattedText上执行命中测试的好方法是什么?
EN

Stack Overflow用户
提问于 2009-02-12 04:19:24
回答 4查看 1.2K关注 0票数 1

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

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

我看过GlyphRun,似乎我可以从它或相关的类中获得命中测试,但我会重新实现许多功能,似乎应该有一个更简单的方法……

有没有人知道实现这一点的好方法?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-02-12 04:44:51

最好的方法是设计一个好的数据结构来存储你的文本,同时也要考虑命中测试。一个例子是将文本拆分成块(单词、行或段落,取决于您需要的内容)。那么每个这样的块都应该有一个边界框,在任何格式化操作中都应该重新计算边界框。在你的设计中还要考虑插入符号的位置。

一旦你有了这样的工具,做命中测试就变得非常容易,只需使用边界框即可。它还将有助于后续操作,如突出显示文本的特定部分。

票数 3
EN

Stack Overflow用户

发布于 2011-07-27 13:31:27

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

代码语言:javascript
复制
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中,可以渲染这些几何体对象,而不是格式化文本。

票数 4
EN

Stack Overflow用户

发布于 2009-02-12 08:15:38

完全同意Sesh的观点--不重新实现整个FormattedText功能的最简单方法是将你想要命中测试的各个项目拆分到它们自己的控件/内联中。

考虑使用TextBlock并将每个单词添加为它自己的内联(或),然后绑定到内联的IsMouseDirectlyOver属性,我们的add委托给MouseEnter & MouseLeave事件。

如果你想对实际的字形进行像素级的点击测试(即鼠标恰好在这个‘i’的点上),那么你需要使用GlyphRuns并对字形进行手动点击测试(阅读:困难的工作)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/540002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档