WPF Richtextbox Application.Find Text 跨越多次运行

标签 wpf richtextbox

我正在尝试为 WPF 富文本框实现 Application.Find 命令。假设我正在寻找“专家”。听起来很容易。但是由于 wpf 的性质,如果“expert”中的每个其他字母都加粗,则 Richtextbox 包含 e*x*p*e*r*t*,这意味着存在六次运行。我有一个起始文本指针。我想弄清楚的是如何获得结尾的 textPointer 以便我可以创建一个 TextRange,我可以用它来创建选择。

在此示例中,起始文本指针在第一次运行中,结束文本指针应在最后一次运行中。如果您知道运行和运行中的偏移量,是否有一种简单的方法来生成文本指针?我尝试使用第一个文本指针的偏移量生成它,但这不起作用,因为偏移量不在第一次运行中。

作为 WPF Richtextbox 的相对新手,这个让我很难过。我想这个问题已经被处理和解决了。我确实找到了一个部分解决方案,但它只适用于单次运行,并没有解决多次运行的情况。

最佳答案

这个想法是找到第一个字符( IndexOf )的偏移量,然后在这个索引处找到 TextPointer (但只计算文本字符)。

public TextRange FindTextInRange(TextRange searchRange, string searchText)
{
    int offset = searchRange.Text.IndexOf(searchText, StringComparison.OrdinalIgnoreCase);
    if (offset < 0)
        return null;  // Not found

    var start = GetTextPositionAtOffset(searchRange.Start, offset);
    TextRange result = new TextRange(start, GetTextPositionAtOffset(start, searchText.Length));

    return result;
}

TextPointer GetTextPositionAtOffset(TextPointer position, int characterCount)
{
    while (position != null)
    {
        if (position.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text)
        {
            int count = position.GetTextRunLength(LogicalDirection.Forward);
            if (characterCount <= count)
            {
                return position.GetPositionAtOffset(characterCount);
            }

            characterCount -= count;
        }

        TextPointer nextContextPosition = position.GetNextContextPosition(LogicalDirection.Forward);
        if (nextContextPosition == null)
            return position;

        position = nextContextPosition;
    }

    return position;
}

这是代码的使用方法:
TextRange searchRange = new TextRange(richTextBox.Document.ContentStart, richTextBox.Document.ContentEnd);
TextRange foundRange = FindTextInRange(searchRange, "expert");
foundRange.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.Red));

关于WPF Richtextbox Application.Find Text 跨越多次运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22229741/

相关文章:

c# - WPF TPL 重新启动取消的任务

c# - WPF 如何让 RichTextBox 的宽度跟随父控件的宽度?

c# - 为什么在将新段落添加到文档 block 时运行的父级变为空?

c# - 如何在richtextbox中建立到本地文件的链接

wpf - 使用 HierarchicalDataTemplate.Triggers 影响 ItemTemplate 中的控件

wpf - Generic.xaml 有什么特别之处?

c# - C# 工具提示中的富文本

vb.net - 如何以编程方式从 ReadOnly RichTextBox 中删除文本?

c# - WPF 反向绑定(bind) OneWayToSource

代码中的 WPF 绑定(bind)