突出显示FlowDocument中的短语

时间:2014-02-19 17:05:47

标签: c# flowdocument textrange

我有一个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&lt;

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

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偏移量包括“符号”,它们不仅仅是可见字符。因此,示例代码无法正常工作,因为您不能只使用带有GetPositionAtOffset的string.IndexOf()。

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

1 个答案:

答案 0 :(得分: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;
}