我已在代码中成功地将命名样式分配给flowdocument元素的style属性。
wStyle = this.FindResource(MyStyleName) as Style;
wParagraph.Style = wStyle;
但是,当文档被保存而不是得到诸如Style =“ {StaticResource MyStyleName}”之类的东西时,我会得到大量的属性设置器。现在,该文档是90%的冗余样式信息。
问题:如何设置样式以引用命名的样式而不复制它。
我现在很困惑。我考虑过将样式名称保存在Tag属性中,然后更新文档的xaml以删除和替换样式信息。我希望有更好的方法。
答案 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解析。