如何快速清除FCTB(Fast Color Text Box)中所有标记?求高效方案
优化标签页标记清除的高效方案
看起来你这段逐行处理的代码在长页面上卡得难受,核心问题是频繁触发UI更新和做了很多没必要的操作——我来给你几个提速的思路:
先砍掉最耗时的冗余操作
你的原代码里每一行都在设置选中位置、触发选中可见性和局部重绘,这些步骤完全和「清除背景标记」无关!直接删掉它们就能快一大截:
基础优化版代码
int iRows = ft.CurrentTB.LineInfos.Count; // 一次性遍历设置所有行的背景,避免逐行UI更新 for (int i = 1; i <= iRows; i++) { CurrentTB[i].BackgroundBrush = Brushes.Transparent; } // 只触发一次完整重绘,替代逐行的Invalidate() CurrentTB.InvalidateVisual();
进阶:用文档逻辑元素替代可视化行遍历
如果你的CurrentTB是WPF的RichTextBox,直接操作它的FlowDocument逻辑结构会比遍历可视化行(LineInfos)高效得多——可视化行是渲染后的结果,遍历起来有额外开销:
高效进阶版代码
// 临时禁用控件,避免操作过程中触发额外UI交互 CurrentTB.IsEnabled = false; try { var document = CurrentTB.Document; // 遍历文档中的所有段落 foreach (var block in document.Blocks) { if (block is Paragraph paragraph) { // 清除段落背景 paragraph.Background = Brushes.Transparent; // 如果段落内有带背景的Run,也一并清除 foreach (var inline in paragraph.Inlines) { if (inline is Run run) { run.Background = Brushes.Transparent; } } } } // 最后一次性重绘控件 CurrentTB.InvalidateVisual(); } finally { // 恢复控件可用状态 CurrentTB.IsEnabled = true; }
为什么这些改动能提速?
- 移除冗余操作:原代码里的
Selection.Start和DoSelectionVisible()会每一行都触发UI滚动和选中状态更新,这在长页面上是巨大的性能开销,完全没必要保留。 - 批量更新+单次重绘:把逐行的
Invalidate()改成最后一次InvalidateVisual(),减少了N次局部重绘变成1次完整重绘,大幅降低UI渲染压力。 - 直接操作逻辑结构:
FlowDocument的段落/Run是文档的原始数据结构,比渲染后的LineInfos遍历更快,尤其在长文档场景下优势明显。
内容的提问来源于stack exchange,提问作者Jaskaran
相关产品推荐
相关产品推荐

