是否存在等效的GetPositionAtOffset()漂亮解决方案,该解决方案仅计算文本插入位置而不是所有符号?

C#中的动机示例:

TextRange GetRange(RichTextBox rtb, int startIndex, int length) {
    TextPointer startPointer = rtb.Document.ContentStart.GetPositionAtOffset(startIndex);
    TextPointer endPointer = startPointer.GetPositionAtOffset(length);
    return new TextRange(startPointer, endPointer);
}

编辑:直到现在我以这种方式“解决”它

public static TextPointer GetInsertionPositionAtOffset(this TextPointer position, int offset, LogicalDirection direction)
{
    if (!position.IsAtInsertionPosition) position = position.GetNextInsertionPosition(direction);
    while (offset > 0 && position != null)
    {
        position = position.GetNextInsertionPosition(direction);
        offset--;
        if (Environment.NewLine.Length == 2 && position != null && position.IsAtLineStartPosition) offset --;
    }
    return position;
}

最佳答案

据我所知,还没有。我的建议是为此创建自己的GetPositionAtOffset方法。您可以使用以下方法检查TextPointer相邻的PointerContext:

TextPointer.GetPointerContext(LogicalDirection);

要获取指向另一个PointerContext的下一个TextPointer,请执行以下操作:
TextPointer.GetNextContextPosition(LogicalDirection);

我在最近的项目中使用了一些示例代码,通过循环直到找到一个指针,从而确保指针上下文的类型为Text。您可以在实现中使用它,并在找到偏移量时跳过它:
// for a TextPointer start

while (start.GetPointerContext(LogicalDirection.Forward)
                             != TextPointerContext.Text)
{
    start = start.GetNextContextPosition(LogicalDirection.Forward);
    if (start == null) return;
}

希望您可以利用此信息。

10-08 20:20