c# - 使用 WPF 显示流式富文本

标签 c# .net wpf flowdocument

我有一个 WPF 应用程序,它通过套接字连接到设备并获取流式文本数据(大约每秒 1 条消息)。然后,此数据会显示在 UI 上。用户可以创建规则,如“如果数据包含‘abc’突出显示行”“……使其变为粗体”,这样纯文本输出就不行了,它需要成为“富文本”。

我目前的解决方案是有一个 FlowDocument在我的包含格式化输出的 ViewModel 中。 View 有一个 FlowDocumentScrollViewer绑定(bind)到 ViewModel 中的 FlowDocument。

这可行,但当 FlowDocument 变大(约 6,000 行)时,性能开始下降。当前算法将行数限制在 10,000 行,但随后情况变得更糟,以至于应用程序无法使用。达到 10,000 行后,我会为添加的每一行删除一行,从而导致 FlowDocumentScrollViewer 为每个新行收到 2 个更新通知。

我试图找到一种批量删除的方法(当我们达到10,000行时删除最旧的1,000行),但FlowDocument上没有批量删除。循环 1,000 次并执行删除操作会产生 1,000 个更新通知并锁定 UI。

这是我的问题,这是我的问题:

使用 WPF 显示流式富文本内容的最佳方式是什么?我每秒收到 ~ 1 条消息,每条消息约 150 个字符,我想保留最后 10000 条消息。我会以错误的方式解决这个问题吗?是否还有其他性能更好的控件/对象?

编辑:这里还有一些要求

  • 需要能够打印输出文本
  • 需要能够选择和复制输出文本,以便将其粘贴到另一个文档中

最佳答案

性能崩溃似乎是由 FlowDocument 中的大量 block 引起的。对于收到的每条消息,我都创建了一个运行,将该运行添加到一个段落并将该段落添加到文档中。

我更改了算法,现在它创建一个段落,然后向该段落添加 250 行,然后创建一个新段落...添加 250 行...等等。这实质上将 block 数减少了一半。

当我达到最大行数 (10,000) 时,这还有一个额外的好处。我可以只删除最旧的段落,而不是为每个添加的新行删除一行(并挂住 CPU),这会立即删除最旧的 250 行。

这个相对简单的更改使性能在可接受的范围内。现在,CPU 保持在相对较低的水平,峰值约为 15%,而不是固定 CPU 并锁定 UI。

关于c# - 使用 WPF 显示流式富文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/726943/

相关文章:

android - 从 MvvmCross 中删除 System.ServiceModel

wpf - 在 MVVM 中,ViewModel 响应 View 中用户操作的最佳方式是什么?

wpf - 如何将flowDocument的内容保存在PDF和Word中?

c# - 正则表达式用 C# 从 CDATA 中解析出 html

.net - 从 .NET 逆向工程 Access 宏

c# - 如何在传递接口(interface)时访问不同具体类的属性

c# - Universal Windows App的水平StackPanel ScrollView

C#Excel : Programmatically open and copy workbook while ignoring dependency

c# - PagesIndex - 对象引用未设置为对象的实例

c# - 如何在 C# 中的每个数学函数前面避免 "Math."?