我是 WPF 的新手,目前我正在学习创建一个具有语法高亮显示的 Sublime Text。我在找出当前插入符号位置的单词的 textrange 时遇到了一个挑战(不包括符号,例如:for( 将返回整个单词而不是 for 只返回)。更多结束,因为已经解决方案正在检查整个文件,这可能会大大降低性能。有没有解决这个问题的方法谢谢!下面是我的代码
private textrange getcurrentWordRange()
{
List<string> spaces = new List<string> { " ","\t",";","(",")","=" };
List<string> symbols=new List<string>{};
TextPointer current = richTextBox.CaretPosition;
TextPointer start = current,end = current;
//Traverse to get the start of word
while (start.GetPointerContext(LogicalDirection.Backward) == TextPointerContext.Text)
{
textrange textrange = new textrange(start.GetPositionAtOffset(-1),start); // get the textrange of the previous start
if (spaces.Any(token => textrange.Text.Contains(token))) // check if textrange.Text has token that inside spaces
break;
else
start = start.GetPositionAtOffset(-1);
}
//Traverse to get the end of word
while(end.GetPointerContext(LogicalDirection.Forward)==TextPointerContext.Text)
{
textrange textrange = new textrange(end,end.GetPositionAtOffset(1)); // get the textrange of the next start
if (spaces.Any(token => textrange.Text.Contains(token)))
break;
else
end = end.GetPositionAtOffset(1);
}
return new textrange(start,end);
}
编辑 幸运的是,我重新思考并编写了可能在这种情况下成功的以下代码。希望任何人都可以检查它是否正确。谢谢。
private textrange getcurrentWordRange()
{
List<string> spaces = new List<string> { " ","\t" };
List<string> symbols = new List<string> { ";","=","<",">","\"",",".","[","]",":" };
TextPointer current = richTextBox.CaretPosition;
TextPointer start = current,end = current;
textrange backward;
textrange forward;
// check if start and end are not the Content.Start and Content.End
if (start.GetPositionAtOffset(-1) == null)
backward = new textrange(start,start);
else
backward = new textrange(start.GetPositionAtOffset(-1),start);
if (end.GetPositionAtOffset(1) == null)
forward = new textrange(end,end);
else
forward = new textrange(end,end.GetPositionAtOffset(1));
while (!spaces.Contains(backward.Text) && start.GetPointerContext(LogicalDirection.Backward) == TextPointerContext.Text && !symbols.Contains(backward.Text))
{
start = start.GetPositionAtOffset(-1);
backward = new textrange(start,start.GetPositionAtOffset(-1));
}
while (!spaces.Contains(forward.Text) && end.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text && !symbols.Contains(forward.Text))
{
end = end.GetPositionAtOffset(1);
forward = new textrange(end,end.GetPositionAtOffset(1));
}
// if between start and end is "" then consider add a left adjacent or right adjacent symbol for further development
if (new textrange(start,end).Text == "")
{
if (symbols.Contains(backward.Text))
{
start = start.GetPositionAtOffset(-1);
}
else if (symbols.Contains(forward.Text))
{
end = end.GetPositionAtOffset(-1);
}
}
return new textrange(start,end);
}
我为 RTB 创建了一个 TextChanged 事件,然后执行一些功能来检查和突出显示关键字 它适用于@Jackdaw 解决方案,但再次陷入这种情况