gpt4 book ai didi

wpf - RichTextBox 高亮表现

转载 作者:行者123 更新时间:2023-12-04 22:09:15 27 4
gpt4 key购买 nike

我正在开发根据正则表达式模式在 RichTextBox 中突出显示文本的应用程序。
它工作正常,除了性能,即使对于小文本(大约 500 个字符),它也会挂起一段时间,这对用户是可见的。

我在 FlowDocument 上做错了什么吗?有人可以指出我性能问题的根源吗?

    public class RichTextBoxManager
{
private readonly FlowDocument inputDocument;
private TextPointer currentPosition;

public RichTextBoxManager(FlowDocument inputDocument)
{
if (inputDocument == null)
{
throw new ArgumentNullException("inputDocument");
}

this.inputDocument = inputDocument;
this.currentPosition = inputDocument.ContentStart;
}

public TextPointer CurrentPosition
{
get { return currentPosition; }
set
{
if (value == null)
{
throw new ArgumentNullException("value");
}
if (value.CompareTo(inputDocument.ContentStart) < 0 ||
value.CompareTo(inputDocument.ContentEnd) > 0)
{
throw new ArgumentOutOfRangeException("value");
}

currentPosition = value;
}
}

public TextRange Highlight(string regex)
{
TextRange allDoc = new TextRange(inputDocument.ContentStart, inputDocument.ContentEnd);
allDoc.ClearAllProperties();
currentPosition = inputDocument.ContentStart;

TextRange textRange = GetTextRangeFromPosition(ref currentPosition, regex);
return textRange;
}

public TextRange GetTextRangeFromPosition(ref TextPointer position,
string regex)
{
TextRange textRange = null;
while (position != null)
{
if (position.CompareTo(inputDocument.ContentEnd) == 0)
{
break;
}

if (position.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text)
{
String textRun = position.GetTextInRun(LogicalDirection.Forward);
var match = Regex.Match(textRun, regex);
if (match.Success)
{
position = position.GetPositionAtOffset(match.Index);
TextPointer nextPointer = position.GetPositionAtOffset(regex.Length);
textRange = new TextRange(position, nextPointer);
textRange.ApplyPropertyValue(TextElement.BackgroundProperty, Brushes.Yellow);
position = nextPointer;
}
else
{
position = position.GetPositionAtOffset(textRun.Length);
}
}
else
{
position = position.GetNextContextPosition(LogicalDirection.Forward);
}
}

return textRange;
}
}

要调用它,我首先在 Initialize 方法中创建一个实例
frm = new RichTextBoxManager(richTextBox1.Document);

和文本框的 textchange 事件(我放正则表达式的地方)我调用 Highlight 方法
frm.Highlight(textBox1.Text);

最佳答案

这是一种不同的方法,但我使用它对具有 200,000 个字符的文件进行亚秒响应。

由于我从文本开始,这可能不适合您。

我索引文本文件的单词位置,用户可以搜索单词。我突出显示他们搜索的单词。

但是我循环遍历文本以创建 FlowDoc 并在构建 FlowDoc 时突出显示。此 FlowDoc 没有格式(除了突出显示)。因此,如果您需要保留格式,这将不起作用。

所以我的猜测是 TextPointer 有很多开销。

但是我从您的代码中学到了很多东西,因为这就是我要尝试突出显示工作的方式,但我根本无法使 TextPointer 工作。

也许看看处理 textRun 中的所有匹配项而不是第一个并增加位置。

关于wpf - RichTextBox 高亮表现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10904907/

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