You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取TextBox中每个字符的X/Y坐标位置?

解决方案

可以利用WPF的TextPointer和GetCharacterRect方法精准获取每个字符在TextBox中的实际显示位置,再转换到画布坐标系下,这个方法会自动处理多行、字距调整以及字形边界的正负偏移问题。

实现步骤与代码示例

  1. 获取TextBox到目标画布的坐标转换对象
  2. 通过TextPointer遍历TextBox中的每个字符
  3. 调用GetCharacterRect获取字符在TextBox内的边界矩形
  4. 将矩形坐标转换为画布坐标系下的位置,用于放置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 04:35:04