C# 高效地存储和显示富文本

C# 高效地存储和显示富文本,c#,wpf,performance,richtextbox,C#,Wpf,Performance,Richtextbox,我需要在SQL数据库中存储大量的富文本,检索并显示它 一种字体可以,但我需要不同的字体大小/粗体/颜色 现在,我使用RichTextBox(WPF)来显示它,并使用XamlWriter.Save/XamlReader.Parse将其序列化为字符串以存储在数据库中。它工作得很好,但是RichTextBox显示文本的速度非常慢,基本上无法使用 有没有一种快速的方法可以在可接受的性能下实现这一点 我正在考虑使用GlyphRun对象,将每个字符绘制为位图,并计算所有对齐要求以适合目标图像等。。。但在20

我需要在SQL数据库中存储大量的富文本,检索并显示它

一种字体可以,但我需要不同的字体大小/粗体/颜色

现在,我使用RichTextBox(WPF)来显示它,并使用XamlWriter.Save/XamlReader.Parse将其序列化为字符串以存储在数据库中。它工作得很好,但是RichTextBox显示文本的速度非常慢,基本上无法使用

有没有一种快速的方法可以在可接受的性能下实现这一点

我正在考虑使用GlyphRun对象,将每个字符绘制为位图,并计算所有对齐要求以适合目标图像等。。。但在2011年,在简单的彩色/大小文本上重新发明轮子似乎真的很奇怪

编辑: 谢谢你的回答,直到现在才看到,对不起

文本也是由用户从
RichTextBox
es输入的,基本上我只是将结果
string
XamlWriter.save(RichTextBox.Document)
保存在数据库中。其他字段(双精度/int等)也由用户从
TextBox
es输入

当用户查询数据库时,使用数据库中的字段(包括上面保存的富格文本字段)从头开始生成带有颜色和格式的只读富格文本页面:这些字段从
FlowDocument
s转换为
Span
s,并对其进行一些替换(
InlineUIContainer
s,它承载一个从
UIElement
派生的类,该类引用一个数据库条目,内联在文本中,如“参见[thisbook]”,其中[thisbook]引用某个数据库条目的ID)。MSDN表示,对于
TextBlock
,所有这些都太多了

文本呈现是非常慢的部分,但是没有办法,我需要格式化,这就是WPF
RichTextBox
es的方式:即使在
RichTextBox
es中输入一个简单的文本,在键入和屏幕上显示的字符之间也会有延迟

现在我仍然使用
RichTextBox
es,但我在内存中保留了大量渲染的布局(
段落
/
部分
/
Span
对象)当用户进行更改/查询或请求数据库数据的不同视图时,我会小心地仅重新提交尽可能少的格式化文本

它仍然不快,但还可以,更改整个结构(AvalonEdit或
格式化文本
GlyphRun
)现在似乎不值得,太多的工作,整个序列化API与
XamlWriter.Save
XamlReader.Parse一起简化了很多(对于
FormattedText
GlyphRun
,我必须自己想出一种文件格式来将格式化文本保存到数据库中)


也有可能使用OpenXMLSDK创建Microsoft Word.docx文档,但谷歌表示渲染性能也不是很好,我不知道是否可以在
InlineUIContainer
中的文本中嵌入
UIElement
,并将其序列化保存在数据库中(AvalonEdit也有同样的问题)。

考虑扔掉
RichTextBox
,因为它太慢了(当场)。与其自己编写文本编辑器,不如检查一下。从性能上看,它比
RichTextBox
更像婴儿

或者,如果您需要只读文本,可以尝试文本块-它支持简单的格式设置:

<TextBlock>
   <Run FontWeight="Bold">Hello</Run>
   <Run Foreground="Green">World</Run>
   <Run FontSize="24">!</Run>
</TextBlock>

你好
世界
!

文本首先是如何生成的?你能使用固定文档吗?你在谈论多少文本?我在FlowDocumentViewer中使用了大量WPF FlowDocuments,效果非常好。你可能应该启动一个分析器,看看你在哪里花费时间;渲染文本是一项昂贵的操作为WPF启用,但您希望确保不会因为奇怪的文档结构或样式/颜色/字体/连字符等而破坏CPU计算布局。