gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:25:55 27 4
gpt4 key购买 nike

我正在尝试为 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com