我有一个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()。
所以看起来答案将涉及正确计算需要包含在偏移中的非字符元素(文档中的符号)。我的天真计算短语跨度的运行次数不起作用。
答案 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;
}