如何获取TextBox中每个字符的X/Y坐标位置?
解决方案
可以利用WPF的TextPointer和GetCharacterRect方法精准获取每个字符在TextBox中的实际显示位置,再转换到画布坐标系下,这个方法会自动处理多行、字距调整以及字形边界的正负偏移问题。
实现步骤与代码示例
- 获取
TextBox到目标画布的坐标转换对象 - 通过
TextPointer遍历TextBox中的每个字符 - 调用
GetCharacterRect获取字符在TextBox内的边界矩形 - 将矩形坐标转换为画布坐标系下的位置,用于放置SVG字形
var transformToCanvas = txtBox.TransformToVisual(myCanvas); TextPointer currentPointer = txtBox.Document.ContentStart; while (currentPointer != null && currentPointer.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text) { // 获取当前字符在TextBox内的显示矩形 Rect charLocalRect = currentPointer.GetCharacterRect(LogicalDirection.Forward); // 转换到画布的全局坐标 Point charCanvasPosition = transformToCanvas.TransformPoint(new Point(charLocalRect.Left, charLocalRect.Top)); // 这里使用charCanvasPosition来定位对应的SVG字形即可 // 例如:放置字形到 (charCanvasPosition.X, charCanvasPosition.Y) // 移动到下一个字符 currentPointer = currentPointer.GetNextContextPosition(LogicalDirection.Forward); }
为什么这个方法适用
- 自动处理多行:
GetCharacterRect会返回字符实际换行后的位置,不需要手动判断换行和计算行偏移 - 适配字距与字形边界:该方法基于WPF的实际排版引擎,会自动应用字体的字距调整(Kerning),同时直接返回字符的实际显示位置,无需手动处理字形边界盒的正负值
- 精准定位:返回的矩形是字符在屏幕上的实际渲染区域,完全匹配用户看到的文本位置
内容的提问来源于stack exchange,提问作者Adam McMahon
相关产品推荐
相关产品推荐

