在富文本框中设置文本格式时的性能问题

本文关键字:格式 性能 问题 置文本 文本 | 更新日期: 2023-09-27 18:31:29

我正在使用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);
        }

问题是,当我使用这种方法时,当文本中有很多关键字时,应用程序的性能会受到严重影响,尤其是每次 RichTextBox 的文本更改时我都会这样做。

我运行分析器,似乎应用程序在documentRange.ClearAllProperties()中花费了一半的处理器时间。

我应该更改哪些内容以提高应用程序的持久性?

任何人都可以提供使用 WPF 富文本框快速语法突出显示的好示例吗?

在富文本框中设置文本格式时的性能问题

我建议的一件事可能会有所帮助,但可能不是一个完整的解决方案,那就是使用计时器来调用语法突出显示代码。 像这样:(伪代码)

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

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

此外,您甚至可以更进一步,实际上使DoSyntaxHighlighting可取消,以便如果它开始突出显示并且用户再次开始键入,突出显示器将停止处理并等待用户再次停止键入。

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

你也可以看看像AvalonEdit这样的东西。