在流文档中设置静态样式,以便仅将Style = {static somestyle}与文档一起保存

时间:2019-04-03 21:31:56

标签: .net styles flowdocument

我已在代码中成功地将命名样式分配给flowdocument元素的style属性。

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

但是,当文档被保存而不是得到诸如Style =“ {StaticResource MyStyleName}”之类的东西时,我会得到大量的属性设置器。现在,该文档是90%的冗余样式信息。

问题:如何设置样式以引用命名的样式而不复制它。

我现在很困惑。我考虑过将样式名称保存在Tag属性中,然后更新文档的xaml以删除和替换样式信息。我希望有更好的方法。

1 个答案:

答案 0 :(得分:0)

我遵循了自己的建议并将命名样式存储在Tag属性中。

保存文档时,我将其通过过滤器,该过滤器将删除Paragraph.Style元素,并将其替换为Style =“ {DynamicResource SomeStyleName}”形式的Style属性。请注意,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%。

在运行时,命名样式由提供给FlowDocumentScrollViewer(用于查看)和RichTextBoox(用于编辑)的ResourceDictionary解析。