Эффективное хранение и отображение расширенного текста - PullRequest
5 голосов
/ 21 июня 2011

Мне нужно хранить значительный объем расширенного текста в базе данных 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).

1 Ответ

1 голос
/ 04 июля 2011

Подумайте о том, чтобы выбросить RichTextBox, потому что это ОГРОМНО МЕДЛЕННО (точка на). Вместо написания собственного текстового редактора установите флажок AvalonEdit . Производительность мудрее, она бьет RichTextBox как ребенок.

Или, если вам нужен текст только для чтения, вы можете попробовать TextBlock - он поддерживает простое форматирование:

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