Установка статического стиля в потоковом документе так, чтобы только стиль = (статический стиль} сохранялся вместе с документом - PullRequest
0 голосов
/ 04 апреля 2019

Я успешно назначаю именованный стиль свойству style элемента flowdocument в коде.

   wStyle = this.FindResource(MyStyleName) as Style;
   wParagraph.Style = wStyle;

Но когда документ сохраняется вместо того, чтобы получить что-то вроде Style = "{StaticResource MyStyleName}", я получаю обширную иерархию установщиков свойств. Документ теперь на 90% избыточен для информации о стиле.

Проблема: Как установить стиль для ссылки на именованный стиль, а не копировать его.

Я сейчас в тупике. Я рассмотрел сохранение имени стиля в свойстве Tag, а затем обновил xaml документа, чтобы удалить и заменить информацию о стиле. Я надеюсь, что есть лучший способ.

1 Ответ

0 голосов
/ 04 апреля 2019

Я следовал своему собственному совету и сохранил именованный стиль в атрибуте 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 (для редактирования).

...