You need to enable JavaScript to run this app. WPF RichTextBox如何编程获取所有高亮文本TextRange(对比Word VBA)
优惠活动
大模型
产品
解决方案
定价
更多

WPF RichTextBox如何编程获取所有高亮文本TextRange(对比Word VBA)

WPF RichTextBox 高亮文本提取实现方案

核心问题

参照MS Word中通过VBA、旧版VSTO C#加载项批量检索高亮文本的能力,需要在WPF RichTextBox 中编程实现:定位文档内所有带高亮格式的文本片段,返回对应的TextRange集合。

实现原理

WPF的文档内容基于逻辑树结构排布,连续的、格式完全一致的文本会形成独立的文本节点。文本高亮本质是给文本元素设置TextElement.BackgroundProperty属性,不存在跨格式片段的虚拟高亮标记。

无需导出RTF后做正则匹配,直接通过TextPointer逐节点遍历文档,判断每个文本片段的背景属性,即可精准收集所有高亮范围,性能与稳定性远高于RTF解析方案。

可复用通用方法

/// <summary>
/// 提取RichTextBox中所有匹配高亮要求的文本范围
/// </summary>
/// <param name="richTextBox">目标RichTextBox实例</param>
/// <param name="targetHighlightBrush">需要匹配的高亮背景画刷,传null则匹配所有带非透明背景的文本</param>
/// <returns>所有匹配的TextRange集合</returns>
public static List<TextRange> GetAllHighlightRanges(RichTextBox richTextBox, Brush targetHighlightBrush = null)
{
    List<TextRange> highlightRanges = new List<TextRange>();
    if (richTextBox?.Document == null)
        return highlightRanges;

    TextPointer currentPosition = richTextBox.Document.ContentStart;
    // 从文档起始位置遍历到文档末尾
    while (currentPosition != null)
    {
        // 仅处理实际承载文本的节点,跳过段落标记、内嵌元素等非文本节点
        if (currentPosition.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text)
        {
            // 截取当前连续文本片段的边界
            TextPointer segmentEnd = currentPosition.GetNextContextPosition(LogicalDirection.Forward);
            TextRange currentSegment = new TextRange(currentPosition, segmentEnd);
            
            // 获取当前片段的背景属性值,判断是否匹配高亮要求
            Brush segmentBackground = currentSegment.GetPropertyValue(TextElement.BackgroundProperty) as Brush;
            bool isHighlightMatch = false;
            if (targetHighlightBrush == null)
            {
                // 无指定颜色时,匹配任意非透明、非空的背景(即所有高亮文本)
                isHighlightMatch = segmentBackground != null 
                                   && !object.Equals(segmentBackground, Brushes.Transparent);
            }
            else
            {
                // 匹配指定颜色的高亮文本
                isHighlightMatch = object.Equals(segmentBackground, targetHighlightBrush);
            }

            if (isHighlightMatch)
            {
                highlightRanges.Add(currentSegment);
            }
        }
        // 移动到下一个文档节点
        currentPosition = currentPosition.GetNextContextPosition(LogicalDirection.Forward);
    }

    return highlightRanges;
}

调用示例

如果需要提取控件内所有黄色背景的高亮文本,直接调用方法即可:

// 匹配所有黄色高亮的文本片段
var yellowHighlightedTexts = GetAllHighlightRanges(rtbTest, Brushes.Yellow);
// 遍历输出提取结果
foreach (TextRange range in yellowHighlightedTexts)
{
    Debug.WriteLine($"提取到高亮文本:{range.Text}");
}

注意事项

  • 该方法的检索能力与Word VBA中设置Selection.Find.Highlight = True的查找逻辑完全对等,会自动识别所有带高亮格式的文本,不依赖RTF格式标记解析。
  • 遍历过程会自动跳过非文本节点,无需额外过滤段落标记、内嵌图片、控件等非文本内容。
  • 相邻位置、格式完全一致的同色高亮文本会自动形成独立的TextRange,不会出现碎片化拆分的问题。

内容的提问来源于stack exchange,提问作者nam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 23:36:03