我有一个指向短语开头的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 + "<");
产生错误的输出:
短语:巧克力慕斯,len=18,tr length=15,tr.text=巧克力慕斯<
我使用以下内容来检索文档中短语的起始位置:
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的IndexOf()。
因此,答案似乎涉及到正确核算需要包含在偏移中的非字符元素(文档中的符号)。我天真地计算这个短语的运行次数是行不通的。
以下方法与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;
}