Сериализация WPF RichTextBox к XAML по сравнению с RTF

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

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

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

5
задан devios1 4 June 2010 в 21:26
поделиться

1 ответ

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

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

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

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

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

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

5
ответ дан 14 December 2019 в 19:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: