如何为FastColoredTextBox添加带样式的大文本且不生成撤销历史?
FastColoredTextBox批量构建文本的性能优化方案
当你通过编程方式构建大段带样式的文本时,默认的AppendText方法会生成大量撤销历史,导致内存和计算资源浪费,这里有几个直接有效的解决方法:
直接操作底层TextSource
FCTB的文本实际存储在TextSource对象中,你可以先独立构建好这个对象,再直接赋值给控件,完全绕过撤销记录生成逻辑:// 创建空白TextSource var customTextSource = new TextSource(); // 批量添加带样式的文本片段 customTextSource.Append("基础内容", null); customTextSource.Append("高亮重点内容", new YourCustomStyle()); // 直接替换控件的TextSource yourFCTB.TextSource = customTextSource; // 按需设置只读 yourFCTB.ReadOnly = true;临时关闭撤销功能
在批量添加文本前禁用撤销管理器,操作完成后清空历史,避免无效记录占用资源:try { // 关闭撤销记录 yourFCTB.UndoManager.Enabled = false; // 批量执行文本添加操作 yourFCTB.AppendText("第一部分内容", styleA); yourFCTB.AppendText("第二部分内容", styleB); // 更多文本添加... } finally { // 清空所有撤销历史 yourFCTB.UndoManager.Clear(); // 设为只读防止后续修改 yourFCTB.ReadOnly = true; }批量插入文本范围
如果你已经把所有内容按样式整理成文本范围集合,可以一次性插入,减少控件的操作次数:var textRanges = new List<TextRange>(); textRanges.Add(new TextRange(0, text1.Length, text1, style1)); textRanges.Add(new TextRange(text1.Length, text1.Length + text2.Length, text2, style2)); // 批量插入所有带样式的文本 yourFCTB.InsertTextRanged(textRanges); // 清理撤销历史并设置只读 yourFCTB.UndoManager.Clear(); yourFCTB.ReadOnly = true;
内容的提问来源于stack exchange,提问作者Kay Zed
相关产品推荐
相关产品推荐

