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

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

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

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

使用 TruncateLongLines 改善这个情况

经过一番探索,笔者在官方 GitHub 仓库中找到了一个相关的 Issues ,Performance issue with word wraphttps://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 添加到编辑器:

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

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

  1. 如果非必要,请禁用 textEditor.Options.EnableHyperlinks 和 EnableEmailHyperlinks 。
  2. 不要启用 ShowSpaces 和 ShowTabs 。

WPF 开发,优化 AvalonEdit 显示单行超长文本的性能。的更多相关文章

  1. 工欲善其事,必先利其器 之 WPF篇: 随着开发轨迹来看高效WPF开发的工具和技巧

    之前一篇<工欲善其事,必先利其器.VS2013全攻略(安装,技巧,快捷键,插件)!> 看到很多朋友回复和支持,非常感谢,尤其是一些拍砖的喷油,感谢你们的批评,受益良多. 我第一份工作便是W ...

  2. .net core 和 WPF 开发升讯威在线客服与营销系统:背景和产品介绍

    本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程.本产品已经成熟稳定并投入商用. 在线演示环境:https://kf-m.shengxunwei.com ...

  3. CozyRSS开发记录16-RssContentView显示

    CozyRSS开发记录16-RssContentView显示 1.RssContentView的布局和绑定 继续参照原型图来写xaml: 然后在RSSContentFrameViewModel里提供绑 ...

  4. Android开发优化之——对Bitmap的内存优化

    http://blog.csdn.net/arui319/article/details/7953690 在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitm ...

  5. WPF开发的彩票程序(练手好例子) 附源码

    前言 WPF是.NET最新的界面开发库,开发界面非常灵活!但是学习WPF难度也非常大. 应朋友之邀,编写了一个小程序.程序虽小,五脏俱全,WPF开发的灵活性可窥见一斑. 对于新手学习有很好的借鉴意义, ...

  6. [原]Android开发优化-Adapter优化

    ListView作为Android开发中使用频率最高的一个控件,保证ListView的流畅运行,对用户体验的提高至关重要.Adapter是ListView和数据源之间的中间人,当每条数据进入可见区时, ...

  7. [WPF]WPF开发方法论

    纵观Windows GUI应用程序开发方法,从Windows API.MFC到Visual Basic再到.NET Framework,WPF的开发方法论是在.NET Framework方法论的基础上 ...

  8. WPF开发的彩票程序(练手好例子)

    前言 WPF是.NET最新的界面开发库,开发界面非常灵活!但是学习WPF难度也非常大. 应朋友之邀,编写了一个小程序.程序虽小,五脏俱全,WPF开发的灵活性可窥见一斑. 对于新手学习有很好的借鉴意义, ...

  9. iOS 9应用开发教程之显示编辑文本标签文本框

    iOS 9应用开发教程之显示编辑文本标签文本框 ios9显示.编辑文本 在iOS,经常会看到一些文本的显示.文字就是这些不会说话的设备的嘴巴.通过这些文字,可以很清楚的指定这些设备要表达的信息.本节将 ...

随机推荐

  1. 【记录一个问题】macos下使用opencl, clSetEventCallback不生效

    一开始的调用顺序是这样: enqueueWriteBuffer enqueueNDRangeKernel enqueueReadBuffer SetEventCallback 执行后主程序用getch ...

  2. 无缓冲文件IO和目录操作

    引言 在后台开发中,对于文件I/O我们通常不使用C语言封装的fopen.fread.fwrite标准I/O,而是直接使用Linux提供的系统调用函数.因为这些系统调用没有使用用户缓冲区,我们直接与内核 ...

  3. 获取URL中的某段字符

    1. Location 对象 Location 对象包含有关当前 URL 的信息. Location 对象是 window 对象的一部分,可通过 window.Location 属性对其进行访问. ️ ...

  4. && || 区别

    command1 && command2 如果command1 成功,那么就执行command2 command1 || command2 如果command1 不成功,那么就执行co ...

  5. K8S SVC 转发原理

    在前面的文章中,我们已经多次使用到了 Service 这个 Kubernetes 里重要的服务对象.而 Kubernetes 之所以需要 Service,一方面是因为 Pod 的 IP 不是固定的,另 ...

  6. pytorch运行错误:ValueError: too many dimensions 'str'

    问题: 本人在使用BERT进行微调的时候,在读取数据的时候出现了一个错误:ValueError: too many dimensions 'str'    于是我Debug了以后,发现问题出现在这个部 ...

  7. Django之ajax(jquery)封装(包含 将 csrftoken 写入请求头方法)

    由于支持问题,未使用 es6 语法 _ajax.js /** * 发起请求 * @param url 请求地址 * @param data 请求数据 { } json格式 * @param type ...

  8. Lesson5——Pandas Panel三维数据结构

    pandas目录 1 简介 自 Pandas 0.25 版本后, Panel 结构已经被废弃. pd.__version__ #查看pandas版本 #'1.2.4' #或者 pd.show_vers ...

  9. js中全局变量和局部变量以及变量声明提升

    javascript中全局变量和局部变量的区别 转载前端小99 发布于2018-04-23 15:31:35 阅读数 2102  收藏 展开 [javascript] view plain copy ...

  10. JAVA多线程学习九-原子性操作类的应用

    当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量i=1,A线程更新i+1,B线程也更新i+1,经过两个线程操作之后可能i不等于3,而是等于2.因为A和B线程在更新变量i ...