0

我有一个 TextPointer tp 指向我想使用 TextRange 突出显示的短语的开头。但是这段代码:

TextRange tr = new TextRange(tp, tp.GetPositionAtOffset(phrase.Length));
Debug.WriteLine("phrase:" + phrase + ", len=" + phrase.Length + " and tr length=" + tr.Text.Length + " and tr.text=" + tr.Text + "<");

产生不正确的输出:

短语:mousse au chocolat, len=18 and tr length=15 and tr.text=mousse au choco<

我使用以下内容检索文档中短语的起始位置:

x = tr.Text.IndexOf(phrase);

在给定字符串短语和文档的 TextRange 的情况下,如何获得子字符串 TextRange?

以下答案显示了用于查找单词的 MSDN 示例代码:

https://stackoverflow.com/a/984836/317033

但是,在我的情况下,它似乎不适用于短语。根据文档: http: //msdn.microsoft.com/en-us/library/ms598662 (v=vs.110).aspx GetPositionAtOffset 偏移量包括“符号”,而不仅仅是可见字符。因此,示例代码也不能正常工作,因为您不能只将 string.IndexOf() 与 GetPositionAtOffset 一起使用。

所以看起来答案将涉及正确考虑需要包含在偏移量中的非字符元素(文档中的符号)。我天真地计算短语跨度的运行次数不起作用。

4

1 回答 1

1

以下方法与仅计算文本字符相同,GetPositionAtOffset但仅计算文本字符。

TextPointer GetTextPositionAtOffset(TextPointer position, int characterCount)
{
    while (position != null)
    {
        if (position.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text)
        {
            int count = position.GetTextRunLength(LogicalDirection.Forward);
            if (characterCount <= count)
            {
                return position.GetPositionAtOffset(characterCount);
            }

            characterCount -= count;
        }

        TextPointer nextContextPosition = position.GetNextContextPosition(LogicalDirection.Forward);
        if (nextContextPosition == null)
            return position;

        position = nextContextPosition;
    }

    return position;
}
于 2014-02-19T20:09:13.860 回答