Мне нужно хранить значительный объем расширенного текста в базе данных SQL, извлекать его и отображать.
Один шрифт в порядке, но мне нужны разные размеры шрифта / полужирный / цвета.
Пока я использую RichTextBox (WPF) для его отображения и XamlWriter.Save/XamlReader.Parse для сериализации его в строки для хранения в БД. Он работает хорошо, но RichTextBox настолько УЖЕ МЕДЛЕННО отображает текст, что его невозможно использовать.
Есть ли быстрый способ сделать это с приемлемой производительностью?
Я подумываю сделать это с объектами GlyphRun, нарисовать каждый символ в виде растрового изображения и вычислить все требования к выравниванию, чтобы соответствовать целевому изображению и т. Д. Но в 2011 году изобретать колесо для простого цветного / объемного текста кажется действительно странным.
EDIT :
Спасибо за ответы, до сих пор их не видел, извините.
Текст также вводится пользователем из RichTextBox
es, в основном я просто сохраняю полученный string
XamlWriter.Save(richTextBox.Document)
в базе данных. Другие поля (double / int и т. Д.) Также вводятся пользователем с TextBox
es.
Когда пользователь запрашивает базу данных, страницы форматированного текста только для чтения с цветами и форматированием создаются с нуля с использованием полей в базе данных, включая поля сохраненного расширенного текста выше: они преобразуются из FlowDocument
s в Span
s, и для них выполняется некоторая замена (InlineUIContainer
s, в которых размещается класс, производный от UIElement
, который ссылается на запись базы данных, вставленную в текст, например, "see [thisbook]", где [thisbook] ссылается на некоторые записи базы данных Я БЫ). MSDN говорит, что все это слишком много текста для TextBlock
.
Рендеринг текста - это действительно медленная часть, но нет никакого способа обойти это, мне нужно это форматирование, и это просто, как WPF RichTextBox
es: даже при вводе небольшого простого текста в RichTextBox
es, есть задержка между вводом и отображением символа на экране ...
Пока я все еще использую RichTextBox
es, но я сохраняю много визуализированных макетов в памяти (объекты Paragraph
/ Section
/ Span
), и я стараюсь воспроизводить только минимально возможное количество форматированного текста когда вносятся изменения / запросы или пользователь запрашивает различные представления данных базы данных.
Это все еще не быстро, но все в порядке, изменение всей структуры (AvalonEdit или FormattedText
или GlyphRun
) сейчас кажется не стоит, слишком много работы, весь API сериализации с XamlWriter.Save
и XamlReader.Parse
значительно упрощает (для FormattedText
и GlyphRun
, мне придется самому придумать формат файла, чтобы сохранить отформатированный текст в базе данных).
Существует также возможность использования OpenXML SDK для создания документов Microsoft Word .docx, но Google говорит, что производительность рендеринга тоже невелика, и я не знаю, встраиваю ли UIElement
в текст в InlineUIContainer
и сериализация, которая будет сохранена в базе данных, будет возможна (та же проблема с AvalonEdit).