Сериализация WPF RichTextBox в XAML против RTF - PullRequest
5 голосов
/ 01 июня 2010

У меня есть RichTextBox и мне нужно сериализовать его содержимое в мою базу данных исключительно для целей хранения. Может показаться, что у меня есть выбор между сериализацией как XAML или RTF, и мне интересно, есть ли какие-либо преимущества для сериализации в XAML по сравнению с RTF, которую я считаю более «стандартной».

В частности, теряю ли я какую-либо возможность из-за сериализации в RTF вместо XAML? Я понимаю, что XAML поддерживает пользовательские классы внутри FlowDocument, но в настоящее время я не использую какие-либо пользовательские классы (хотя потенциал для расширяемости может быть достаточной причиной для использования XAML).

Обновление: В итоге я выбрал RTF из-за его поддержки встроенных текстовых кодированных изображений. XAML, похоже, не включает данные изображения в свою кодировку, а XamlPackage кодирует в двоичный файл, поэтому RTF для меня работает лучше. Пока что я не заметил недостатка возможностей.

Ответы [ 2 ]

5 голосов
/ 05 июня 2010

Если все ваши пользователи набирают RichTextBox и выполняют форматирование символов, RTF так же хорош, как XAML. Однако существует множество возможностей FlowDocument, которые вы можете использовать в своем пользовательском интерфейсе и которые не могут быть преобразованы в RTF.

Вот несколько примеров функций FlowDocument (и RichTextBox), которые не выражаются в RTF или реализованы по-другому:

  • Блок может иметь произвольную BorderBrush, включая градиентные кисти с остановками, VisualBrush
  • Раздел имеет свойство HasTrailingParagraphBreakOnPaste
  • Floater / ClearFloaters реализован по-разному
  • Перенос можно включать / отключать для каждого блока, а не только для каждого абзаца
  • Стили WPF и словари ресурсов могут быть включены в свойство Resources
  • Произвольный пользовательский интерфейс WPF, такой как связанные флажки и т. Д., Может быть встроен в RichTextBox и может быть вырезан и вставлен из других окон.

Например, предположим, что вы хотите разрешить пользователям перетаскивать или вырезать / вставлять в поле «текущая дата / время» в RichTextBox, в котором всегда отображаются текущие дату и время. Это можно сделать, добавив второй доступный только для чтения RichTextBox, который имеет InlineUIContainer и уже связанный элемент управления. Это работает даже при вырезании и вставке из других приложений и не требует пользовательских элементов управления.

Другое соображение заключается в том, что код для преобразования между FlowDocument и RTF является относительно сложным, поэтому он может иметь более низкую производительность, чем при работе с XAML. Конечно, свободный XAML не включает изображения и тому подобное - для этого вам нужно использовать XamlPackage. Я храню свой XamlPackage в базе данных как байт [], но вы также можете выбрать кодирование Base64 для хранения в виде строки.

Суть в том, что это действительно зависит от того, хотите ли вы, чтобы пользователь мог использовать функции, недоступные в RTF. Даже если ваше приложение не содержит инструментов для создания FlowDocuments, использующих эти функции, их можно вырезать и вставлять из других приложений.

0 голосов
/ 17 сентября 2010

Имейте в виду, что в методе Wpf RichTextBox с именем TextRange.Save есть ошибка, из-за которой он теряет любой конец конца строки. Microsoft не исправит.

https://connect.microsoft.com/WPF/feedback/ViewFeedback.aspx?FeedbackID=478640&wa=wsignin1.0#tabs

...