我试图用WPF RichTextEditor实现一个基本的语法高亮显示。为此,我想以不同的颜色显示{} gropus。TextRange GetPositionAtOffset不像预期的那样运行
这里的这应该一个RichTextBox的内容分成不同的组的代码:
List<Tag> SplitIntoParts(TextRange textRange, int level)
{
if (textRange==null||textRange.IsEmpty)
{
return new List<Tag>();
}
string text = textRange.Text;
if (text.Length==0)
{
return new List<Tag>();
}
int startPos=-1, counter = 0;
List<Tag> result=new List<Tag>();
for (int i = 0; i < text.Length; i++)
{
if (text[i]=='{')
{
if (counter==0)
{
startPos = i;
}
counter++;
}
if (text[i]=='}')
{
if (counter==1)
{
Tag t = new Tag()
{
StartPosition = textRange.Start.GetPositionAtOffset(startPos),
EndPosition = textRange.Start.GetPositionAtOffset(i+1),
Level = level,
Word = text.Substring(startPos,i+1-startPos)
};
result.Add(t);
var tr=new TextRange(textRange.Start.GetPositionAtOffset(startPos + 1), textRange.Start.GetPositionAtOffset(i));
result.AddRange(SplitIntoParts(tr, level + 1));
}
counter--;
}
}
if (counter>0)//some open branches still left
{
var i = text.Length;
Tag t = new Tag()
{
StartPosition = textRange.Start.GetPositionAtOffset(startPos),
EndPosition = textRange.End,
Level = level,
Word = text.Substring(startPos, i - startPos)
};
result.Add(t);
result.AddRange(SplitIntoParts(new TextRange(textRange.Start.GetPositionAtOffset(startPos + 1), textRange.Start.GetPositionAtOffset(i - 1)), level + 1));
}
return result;
}
在该代码中,我发现textRange.Start.GetPositionAtOffset(startPos + 1)运行异常:
让我们说,该代码已发现以下组:
{test|try}
,并与下面的代码选中:
(例如, t.Word == '{测试|试}')
当我试图通过递归路过
var tr=new TextRange(textRange.Start.GetPositionAtOffset(startPos + 1), textRange.Start.GetPositionAtOffset(i));
result.AddRange(SplitIntoParts(tr, level + 1));
,而不是做同样的 “测试|试”,tr.Text ==“{测试“
为什么我得到这种行为,我应该如何处理它?