我試圖用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 ==「{測試「
爲什麼我得到這種行爲,我應該如何處理它?