You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何快速清除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:54:59