在富文本框中设置文本格式时的性能问题
本文关键字:格式 性能 问题 置文本 文本 | 更新日期: 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这样的东西。