如何提升WPF中AvalonEdit显示超长文本单行的性能优化效果?

2026-05-22 16:151阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计924个文字,预计阅读时间需要4分钟。

如何提升WPF中AvalonEdit显示超长文本单行的性能优化效果?

%E8%B7%AF%E9%81%A5%E5%B7%A5%E5%85%B7%E7%AE%B1%E5%86%85%E7%BD%AE%E4%BA%86%E4%B8%80%E4%B8%AA%E5%90%8D%E4%B8%BA%E2%80%9CJSON%E6%A0%BC%E5%BC%8F%E5%8C%96%E2%80%9D%E7%9A%84%E5%8A%9F%E8%83%BD%E3%80%82%E8%BF%99%E4%B8%AA%E5%8A%9F%E8%83%BD%E5%8F%AF%E4%BB%A5%E5%B0%86JSON%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%BF%9B%E8%A1%8C%E7%BE%8E%E5%8C%96%E5%92%8C%E7%AE%80%E5%8C%96%EF%BC%88%E8%AE%BE%E7%BD%AE%E7%BC%A9%E8%BF%9B%E5%92%8C%E5%8F%96%E6%B6%88%E7%BC%A9%E8%BF%9B%EF%BC%89%E3%80%82%E5%A4%A7%E9%83%A8%E5%88%86%E7%BB%8F%E7%94%B1%E7%BD%91%E7%BB%9C%E4%BC%A0%E8%BE%93%E7%9A%84%E2%80%9CJSON%E2%80%9D%E6%95%B0%E6%8D%AE%E5%8F%8A%E5%BE%97%E5%A4%9A%E5%AE%A2%E6%88%B7%E7%9A%84%E8%AE%A4%E8%AF%81%E3%80%82

路遥工具箱内置了一个名为“JSON 格式化”的功能。通过该功能可以将 JSON 字符串进行美化和简化(设置缩进和取消缩进)。

该功能上线后收到很多客户的反馈:大部分经由网络传输的JSON消息都是未缩进的,在尝试使用JSON美化工具对其进行加载时发生了卡死的情况。经笔者实测:一个两兆左右的 JSON 文件需要三分钟左右去渲染。

在展示单行超长文本时,包括 Visual Studio、Notpad2 在内的软件表现都不尽人意。卡顿在加载和拖动时都会发生,特别是需要自动折行的时候。

原生的 TextBox 控件在面对这么长的单行文本时也会出现卡顿。如果取消自动折行(设置 WrapText 为 False)可以改善这种情况。AvalonEdit 支持调整折行显示,但仍旧需要较长的时间去渲染。

使用 TruncateLongLines 改善这个情况

经过一番探索,笔者在官方 GitHub 仓库中找到了一个相关的 Issues ,Performance issue with word wrap :github.com/icsharpcode/AvalonEdit/issues/11 。其中提到了一个名为 TruncateLongLines 的类型:

public class TruncateLongLines : VisualLineElementGenerator { const int maxLength = 2000; const string ellipsis = "..."; const int charactersAfterEllipsis = 100; public override int GetFirstInterestedOffset(int startOffset) { DocumentLine line = CurrentContext.VisualLine.LastDocumentLine; if (line.Length > maxLength) { int ellipsisOffset = line.Offset + maxLength - charactersAfterEllipsis - ellipsis.Length; if (startOffset <= ellipsisOffset) return ellipsisOffset; } return -1; } public override VisualLineElement ConstructElement(int offset) { return new FormattedTextElement(ellipsis, CurrentContext.VisualLine.LastDocumentLine.EndOffset - offset - charactersAfterEllipsis); } }

这段代码的核心逻辑是:如果检测到单行的字符串数量超过 2000 个(通过 maxLength 常量控制),那么就省略中间部分的内容直接渲染为省略号(通过 ellipsis 常量控制)。此操作虽然会改变文字的显示,但不会对全选复制造成影响。考虑到 JSON 在未缩进的情况下本身就不便于阅读和编辑,所以使用该策略并不会对客户造成影响。

JSON美化功能的超长文本自动截断功能

应用该策略后,即便是超长的 JSON 也没有造成性能问题(单行渲染的字符数被限制后,代码着色也失效了)。美化缩进后的 JSON 很难触发这个策略,且 AvalonEdit 在面对多行文本时效率表现优秀。

TruncateLongLines 的使用方法

使用以下代码将 TruncateLongLines 添加到编辑器:

如何提升WPF中AvalonEdit显示超长文本单行的性能优化效果?

editor.TextArea.TextView.ElementGenerators.Add(new TruncateLongLines());

此外,为了获得更好的性能你需要:

  1. 如果非必要,请禁用 textEditor.Options.EnableHyperlinks 和 EnableEmailHyperlinks 。
  2. 不要启用 ShowSpaces 和 ShowTabs 。
欢迎来到:码农很忙 。

本文共计924个文字,预计阅读时间需要4分钟。

如何提升WPF中AvalonEdit显示超长文本单行的性能优化效果?

%E8%B7%AF%E9%81%A5%E5%B7%A5%E5%85%B7%E7%AE%B1%E5%86%85%E7%BD%AE%E4%BA%86%E4%B8%80%E4%B8%AA%E5%90%8D%E4%B8%BA%E2%80%9CJSON%E6%A0%BC%E5%BC%8F%E5%8C%96%E2%80%9D%E7%9A%84%E5%8A%9F%E8%83%BD%E3%80%82%E8%BF%99%E4%B8%AA%E5%8A%9F%E8%83%BD%E5%8F%AF%E4%BB%A5%E5%B0%86JSON%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%BF%9B%E8%A1%8C%E7%BE%8E%E5%8C%96%E5%92%8C%E7%AE%80%E5%8C%96%EF%BC%88%E8%AE%BE%E7%BD%AE%E7%BC%A9%E8%BF%9B%E5%92%8C%E5%8F%96%E6%B6%88%E7%BC%A9%E8%BF%9B%EF%BC%89%E3%80%82%E5%A4%A7%E9%83%A8%E5%88%86%E7%BB%8F%E7%94%B1%E7%BD%91%E7%BB%9C%E4%BC%A0%E8%BE%93%E7%9A%84%E2%80%9CJSON%E2%80%9D%E6%95%B0%E6%8D%AE%E5%8F%8A%E5%BE%97%E5%A4%9A%E5%AE%A2%E6%88%B7%E7%9A%84%E8%AE%A4%E8%AF%81%E3%80%82

路遥工具箱内置了一个名为“JSON 格式化”的功能。通过该功能可以将 JSON 字符串进行美化和简化(设置缩进和取消缩进)。

该功能上线后收到很多客户的反馈:大部分经由网络传输的JSON消息都是未缩进的,在尝试使用JSON美化工具对其进行加载时发生了卡死的情况。经笔者实测:一个两兆左右的 JSON 文件需要三分钟左右去渲染。

在展示单行超长文本时,包括 Visual Studio、Notpad2 在内的软件表现都不尽人意。卡顿在加载和拖动时都会发生,特别是需要自动折行的时候。

原生的 TextBox 控件在面对这么长的单行文本时也会出现卡顿。如果取消自动折行(设置 WrapText 为 False)可以改善这种情况。AvalonEdit 支持调整折行显示,但仍旧需要较长的时间去渲染。

使用 TruncateLongLines 改善这个情况

经过一番探索,笔者在官方 GitHub 仓库中找到了一个相关的 Issues ,Performance issue with word wrap :github.com/icsharpcode/AvalonEdit/issues/11 。其中提到了一个名为 TruncateLongLines 的类型:

public class TruncateLongLines : VisualLineElementGenerator { const int maxLength = 2000; const string ellipsis = "..."; const int charactersAfterEllipsis = 100; public override int GetFirstInterestedOffset(int startOffset) { DocumentLine line = CurrentContext.VisualLine.LastDocumentLine; if (line.Length > maxLength) { int ellipsisOffset = line.Offset + maxLength - charactersAfterEllipsis - ellipsis.Length; if (startOffset <= ellipsisOffset) return ellipsisOffset; } return -1; } public override VisualLineElement ConstructElement(int offset) { return new FormattedTextElement(ellipsis, CurrentContext.VisualLine.LastDocumentLine.EndOffset - offset - charactersAfterEllipsis); } }

这段代码的核心逻辑是:如果检测到单行的字符串数量超过 2000 个(通过 maxLength 常量控制),那么就省略中间部分的内容直接渲染为省略号(通过 ellipsis 常量控制)。此操作虽然会改变文字的显示,但不会对全选复制造成影响。考虑到 JSON 在未缩进的情况下本身就不便于阅读和编辑,所以使用该策略并不会对客户造成影响。

JSON美化功能的超长文本自动截断功能

应用该策略后,即便是超长的 JSON 也没有造成性能问题(单行渲染的字符数被限制后,代码着色也失效了)。美化缩进后的 JSON 很难触发这个策略,且 AvalonEdit 在面对多行文本时效率表现优秀。

TruncateLongLines 的使用方法

使用以下代码将 TruncateLongLines 添加到编辑器:

如何提升WPF中AvalonEdit显示超长文本单行的性能优化效果?

editor.TextArea.TextView.ElementGenerators.Add(new TruncateLongLines());

此外,为了获得更好的性能你需要:

  1. 如果非必要,请禁用 textEditor.Options.EnableHyperlinks 和 EnableEmailHyperlinks 。
  2. 不要启用 ShowSpaces 和 ShowTabs 。
欢迎来到:码农很忙 。