gpt4 book ai didi

WPF:将格式应用于 RichTextBox 的快速方法

转载 作者:行者123 更新时间:2023-12-04 21:20:29 25 4
gpt4 key购买 nike

我正在尝试在 WPF RichTextBox 中显示基本语法突出显示。它主要工作,但渲染性能很糟糕。

首先我天真地尝试:

/// <summary>
/// Main event handler for syntax highlighting.
/// </summary>
private void XmlChanged(object sender, TextChangedEventArgs e)
{
VM.Dirty = true;
if (VM.Pretty)
{
var range = new TextRange(XmlView.Document.ContentStart, XmlView.Document.ContentEnd);
Render(range.Text);
}
}

/// <summary>
/// Entry point for programmatically resetting the textbox contents
/// </summary>
private void Render(string text)
{
XmlView.TextChanged -= this.XmlChanged;

if (VM.Pretty)
{
var tokens = tokenizer.Tokenize(text);
Format(XmlView.Document, tokens);
}

XmlView.TextChanged += this.XmlChanged;
}

private void Format(FlowDocument doc, List<Token> tokens)
{
var start = doc.ContentStart;
foreach (var token in tokens)
{
TextRange range = new TextRange(start.GetPositionAtOffset(token.StartPosition, LogicalDirection.Forward),
start.GetPositionAtOffset(token.EndPosition, LogicalDirection.Forward));
range.ApplyPropertyValue(TextElement.ForegroundProperty, m_syntaxColors[token.Type]);
}
}

在一个 2KB 的文档上测试,只有 100 多个 token ,每次击键后重绘需要 1-2 秒;显然不能接受。分析显示我的标记器比 Format() 函数快几个数量级。所以我尝试了一些双缓冲:
private void Render(string text)
{
XmlView.TextChanged -= this.XmlChanged;

// create new doc offscreen
var doc = new FlowDocument();
var range = new TextRange(doc.ContentStart, doc.ContentEnd);
range.Text = text;

if (VM.Pretty)
{
var tokens = tokenizer.Tokenize(text);
Format(doc, tokens);
}

// copy to active buffer
var stream = new MemoryStream(65536);
range.Save(stream, DataFormats.XamlPackage);
var activeRange = new TextRange(XmlView.Document.ContentStart, XmlView.Document.ContentEnd);
activeRange.Load(stream, DataFormats.XamlPackage);

XmlView.TextChanged += this.XmlChanged;
}

基准测试表明 Format() 在屏幕外渲染的运行速度略快,但现在感知性能更糟!

解决这个问题的正确方法是什么?

最佳答案

我会尝试从方法/循环中取出尽可能多的对象实例,并改为传入引用。每次击键,每次循环都会调用 new 多次。

关于WPF:将格式应用于 RichTextBox 的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1288920/

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