我正在创建一个使用RichTextBox进行简单语法突出显示的编辑器。突出显示自身的过程使用以下功能实现:
TextRange documentRange = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);
documentRange.ClearAllProperties();
.......
tags.Sort((i, j) => i.Level > j.Level ? 1 : i.Level == j.Level ? 0 : -1);
Color []_colors=new Color[]{Colors.Blue,Colors.Brown,Colors.BlueViolet,Colors.Crimson,Colors.DarkBlue,
Colors.Green,Colors.DimGray,Colors.DarkGray,Colors.Maroon,Colors.Navy,Colors.Red};
foreach (var tag in tags)
{
TextRange range = new TextRange(tag.StartPosition, tag.EndPosition);
range.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(_colors[tag.Level%_colors.Length]));
range.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Bold);
}
问题是,当我使用这种方法时,当文本中有很多关键字时,应用程序的性能会受到很大影响,尤其是每次RichTextBoxe的文本发生变化时我都会这样做。
我运行了探查器,似乎应用程序将其处理器时间的一半花费在documentRange.ClearAllProperties()中。
我应该改变什么来改善应用程序的持久性?
有人能提供使用WPF RichTextBox快速语法高亮的好例子吗?
答案 0 :(得分:2)
我建议的一件事可能会有所帮助,但可能不是一个完整的解决方案,就是使用计时器调用语法高亮代码。类似的东西:(伪代码)
OnRichTextChanged()
{
StopExisingSyntaxHighlighterTimer();
StartSyntaxHighlighterTimer(TimeSpan.FromSeconds(5));
}
OnSyntaxHighlighterTimerFired()
{
StopExisingSyntaxHighlighterTimer();
DoSyntaxHighlighting();
}
当用户暂停5秒或更长时间时,你只是在进行语法高亮显示的想法,这样你就不会尝试用每一次击键重新突出显示整个RichTextBox。
此外,你甚至可以更进一步,实际上使DoSyntaxHighlighting
可取消,这样如果它开始突出显示并且用户再次开始输入,荧光笔会停止处理并等待用户停止输入试。
这可能看起来有点时髦,因为突出显示会在他们打字和停止时消失并重新出现。但它肯定会提高性能。
您还可以查看类似AvalonEdit的内容。