我正在尝试使用 WPF RichTextEditor 实现基本语法高亮。为此,我想以不同的颜色显示 {} gropus。
这是应该将 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}
并使用以下代码选择它:
var t=new Tag()
{
StartPosition = textRange.Start.GetPositionAtOffset(startPos),
EndPosition = textRange.Start.GetPositionAtOffset(i+1),
Level = level,
Word = text.Substring(startPos,i+1-startPos)
};
(egtWord=='{test|try}')
当我尝试通过传递递归地做同样的事情时
var tr=new TextRange(textRange.Start.GetPositionAtOffset(startPos + 1), textRange.Start.GetPositionAtOffset(i));
result.AddRange(SplitIntoParts(tr, level + 1));
而不是“test|try”,tr.Text =="{test"
为什么我会出现这种行为,我应该如何处理?