【问题标题】:Performance issues when formatting text in RichTextBox在 RichTextBox 中格式化文本时的性能问题
【发布时间】:2012-04-19 03:28:19
【问题描述】:

我正在使用 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 快速突出显示语法的好例子?

【问题讨论】:

    标签: c# wpf richtextbox


    【解决方案1】:

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

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

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

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

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

    您也可以查看AvalonEdit 之类的内容。

    【讨论】:

    • 我有同样的想法,如果我没有任何选择,我可能会实现它。但我宁愿做得好。我不敢相信,没有这样做的好方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多