我需要在SQL数据库中存储大量的富文本,检索并显示它。
整个字体都可以,但我需要不同的字体大小/粗体/颜色。
现在我使用RichTextBox(WPF)来显示它,并使用XamlWriter.Save/XamlReader.Parse将其序列化为存储在数据库中的字符串。它运行良好,但RichTextBox在显示基本上无法使用的文本时非常缓慢。
是否可以通过可接受的性能快速完成此操作?
我正在考虑使用GlyphRun对象,将每个角色绘制为位图并计算所有对齐要求以适应目标图像等...但是在简单的彩色/可调整大小的文本上重新发明轮子在2011年看起来很奇怪。
修改: 谢谢你的回答,直到现在才看到他们,对不起。
用户也会从RichTextBox
输入文字,基本上我只是将结果string
XamlWriter.Save(richTextBox.Document)
保存在数据库中。其他字段(double / int等)也由用户从TextBox
es。
当用户查询数据库时,使用数据库中的字段从头开始生成带有颜色和格式的只读富文本页面,包括上面保存的富文本字段:这些字段是从FlowDocument
转换而来的到Span
并对它们进行了一些替换(InlineUIContainer
s,它们托管了一个派生自UIElement
的类,该类引用了一个数据库条目,在文本中内联,如“see [thisbook]”其中[thisbook]引用一些数据库条目的ID)。 MSDN说TextBlock
的所有内容都太多了。
文本渲染是非常缓慢的部分,但没有办法解决它,我需要格式化,这就是WPF RichTextBox
es的方式:即使在{{1}中输入一个简单的文本因此,在键入和出现在屏幕上的角色之间存在延迟...
现在我仍然使用RichTextBox
es但我在内存中保留了大量渲染的布局(RichTextBox
/ Paragraph
/ Section
个对象)并且我谨慎地重新渲染在进行更改/查询或用户请求数据库数据的不同视图时,只能使用最少量的格式化文本。
它仍然不是很快但是没关系,改变整个结构(AvalonEdit或Span
或FormattedText
)现在似乎不值得,太多的工作,整个序列化API与{{ 1}}和GlyphRun
简化了很多(对于XamlWriter.Save
和XamlReader.Parse
,我必须自己想出一种文件格式来将格式化文本保存到数据库中。
还有可能使用OpenXML SDK创建Microsoft Word .docx文档,但谷歌表示渲染性能也不是很好,我不知道是否在文本中嵌入FormattedText
GlyphRun
并且可以序列化要保存在数据库中的数据(与AvalonEdit相同的问题)。
答案 0 :(得分:1)
考虑扔掉RichTextBox
,因为它非常慢(点亮)。而不是编写自己的文本编辑器检查AvalonEdit。表现明智,它像婴儿一样击败RichTextBox
。
或者,如果您需要只读文本,可以尝试使用TextBlock - 它支持简单格式化:
<TextBlock>
<Run FontWeight="Bold">Hello</Run>
<Run Foreground="Green">World</Run>
<Run FontSize="24">!</Run>
</TextBlock>