在RichTextBox中格式化文本时的性能问题

时间:2012-04-18 18:32:44

标签: c# wpf richtextbox

我正在创建一个使用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快速语法高亮的好例子吗?

1 个答案:

答案 0 :(得分:2)

我建议的一件事可能会有所帮助,但可能不是一个完整的解决方案,就是使用计时器调用语法高亮代码。类似的东西:(伪代码)

OnRichTextChanged() 
{
   StopExisingSyntaxHighlighterTimer();
   StartSyntaxHighlighterTimer(TimeSpan.FromSeconds(5));
}

OnSyntaxHighlighterTimerFired() 
{
   StopExisingSyntaxHighlighterTimer();
   DoSyntaxHighlighting();
}

当用户暂停5秒或更长时间时,你只是在进行语法高亮显示的想法,这样你就不会尝试用每一次击键重新突出显示整个RichTextBox。

此外,你甚至可以更进一步,实际上使DoSyntaxHighlighting可取消,这样如果它开始突出显示并且用户再次开始输入,荧光笔会停止处理并等待用户停止输入试。

这可能看起来有点时髦,因为突出显示会在他们打字和停止时消失并重新出现。但它肯定会提高性能。

您还可以查看类似AvalonEdit的内容。