WPF:将内容分配给RichTextBox.Document非常缓慢(7分钟!)

5
我正在从XML构建格式化的FlowDocument。该XML格式正确,主要由10,000个节点组成,每个节点都有一个包含6个字符字符串值的单一节点。
将XML解析为XElement并在内存中构建FlowDocument大约需要5秒钟的时间。然后将FlowDocument分配给应用程序中RichTextBox的Document属性需要大约7分钟,并且在此期间会使CPU达到最大值。
以下是相关代码片段:
// The following six lines of code execute in about 5 seconds

var xml = XElement.Parse(response.Data);

PrettyXmlConverter px = new PrettyXmlConverter();
FlowDocument fd = px.Render(xml);

Paragraph p = new Paragraph();
p.Inlines.Add(new Run(response.TimeStamp.ToShortDateString() + " " + response.TimeStamp.ToLongTimeString()));
fd.Blocks.InsertBefore(fd.Blocks.ElementAt(0), p);

// This line of code takes about 7 minutes and maxes out the CPU for that time.
tbResponse.Document = fd;

我想知道这里发生了什么。我已经对代码进行了分析,发现有成千上万次调用未受控方法,例如fsFormatSubtrackBottomlessSubtrackFormatParaBottomless

有人能够解决这个问题或提出解决方法吗?

2个回答

4
以下摘自MacDonald的《Pro WPF in C# 2010》一书第966页:
WPF RichTextBox和前面的大多数富文本控件一样,可能会有点缓慢。如果您需要存储大量数据、使用错综复杂的逻辑来处理按键或添加效果(例如Visual Studio的语法突出显示或Word的拼写检查下划线),那么WPF RichTextBox可能不会提供您所需的性能。

1
@leetNightshade: 当你谷歌搜索时,这是一个付费广告的网址:http://www.textcontrol.com/en_US/sites/dotnet-rich-text-editor-control/?gclid=CP668O7M2rgCFUVb3godDRkAAg。我也知道有开源的选择,它们位于codeplex和code project上,只是记不得它们的名字了。 - Sabuncu
3
嗯,不错的发现!我确实找到了一个替代品,但是用途与你分享的不同(我还没有尝试过):https://github.com/PavelTorgashov/FastColoredTextBox - leetNightshade
+1 这与我所见过的任何东西都非常不同。谢谢分享。 - Sabuncu

0
最终,我没有找到解决方案。
我使用了一个变通方法 - 我只是不会“漂亮地打印”超过一定大小的消息。
如果有更好的解决方案,请随时发布。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接