Я следовал своему собственному совету и сохранил именованный стиль в атрибуте Tag.
Когда я сохраняю документ, я пропускаю его через фильтр, который удаляет элемент Paragraph.Style и заменяет его атрибутом Style.вида Style = "{DynamicResource SomeStyleName}".Обратите внимание, что DynamicResource необходим, поскольку документ не будет анализироваться при загрузке.
В моем случае только абзацы имеют именованные стили.Код для фильтра выглядит следующим образом:
private string ReplaceStyleInfo(string pTopicContent)
{
// RichtextBox inlines named styles (H1 etc.) on paragraphs as huge hierarchies of setters - so drop all stlye info and set to the Form Style="{StaticResource stylename}"
// The named style is held in the Tag property.
XDocument wXDocument = XDocument.Parse(pTopicContent);
var wParagraphs = from p in wXDocument.Root.Elements()
where p.Name.LocalName == "Paragraph"
select p;
foreach (XElement wParagraph in wParagraphs)
{
if (wParagraph.Attribute("Tag") != null)
{
var wStyleName = wParagraph.Attribute("Tag").Value;
XAttribute wStyleAttribute = wParagraph.Attribute("Style");
if (wStyleAttribute == null)
{
wParagraph.Add(new XAttribute("Style", "{DynamicResource " + wStyleName + "}"));
}
else
{
wStyleAttribute.Value = "{DynamicResource " + wStyleName + "}";
}
}
else
{
XAttribute wStyleAttribute = wParagraph.Attribute("Style");
if (wStyleAttribute != null)
{
wStyleAttribute.Remove();
}
}
var wParagraphStyle = from p in wParagraph.Elements()
where p.Name.LocalName == "Paragraph.Style"
select p;
wParagraphStyle.Remove();
}
return wXDocument.ToString();
}
Это прекрасно работает и сокращает сохраненные документы примерно на 80%.
Во время выполнения именованные стили разрешаются с помощью ResourceDictionary, предоставленного дляFlowDocumentScrollViewer (для просмотра) и RichTextBoox (для редактирования).