使用XmlWriter写出带有命名空间的FlowDocument xaml

时间:2011-01-25 15:52:28

标签: wpf xaml flowdocument flowdocumentreader

我有一个需要转换为.xaml文件的数据集合,以后可以将其作为FlowDocument加载到FlowDocumentReader中。我不直接实例化Paragraphs,Runs,而是生成xaml以便稍后创建文档。

我尝试了什么:

我遍历数据,为Paragraphs,Runs,InlineUIContainers等创建XElements并构建FlowDocument结构,然后调用:

XmlWriter writer = XmlWriter.Create("output.xaml");
flowDocElem.WriteTo(writer);
writer.Close();

在消费应用中,我这样做:

flowDocument = XamlReader.Load(xamlFile) as FlowDocument;
flowDocumentReader.Document = flowDocument;
xamlFile.Close();

但加载失败,因为它不知道FlowDocument是什么。 FlowDocument元素如下所示:

<FlowDocument Name="testDoc">

(那里没有名称空间可以说明在阅读时FlowDocument是什么。)

如果我手动编辑.xaml并将元素修改为:

<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Name="testDoc">

然后它会加载很好。

为FlowDocument创建XElement时,我尝试这样做:

new XElement("FlowDocument", new XAttribute("Name", "testDoc"), new XAttribute("xmlns", "http://schemas.microsoft.com/winfx/2006/xaml/presentation"));

但是这也不起作用 - 如果我尝试创建名称空间属性,则会给我一个错误。

我可以完全欺骗并将xmlns填充到元素中,然后调用类似

的内容
File.WriteAllText("output.xaml", fixedTxt);

但这感觉很脏,所以我觉得我只是做错了。

思想?


更新

虽然这可能不是问题的说明性解决方案,但它 工作:

通过向XamlReader添加 ParserContext ,我能够解决加载FlowDocument xml的问题。

FileStream xamlFile = new FileStream("output.xaml", FileMode.Open, FileAccess.Read);
XamlReader x = new XamlReader();
ParserContext parserContext = new ParserContext();
parserContext.XmlnsDictionary.Add("","http://schemas.microsoft.com/winfx/2006/xaml/presentation");
flowDocument = XamlReader.Load(xamlFile, parserContext) as FlowDocument;
flowDocumentReader.Document = flowDocument;
xamlFile.Close();

2 个答案:

答案 0 :(得分:2)

尝试使用XamlWriter代替XmlWriter

答案 1 :(得分:0)

如果您使用XLinq,请尝试以下操作:

XNamespace ns = @"http://schemas.microsoft.com/winfx/2006/xaml/presentation";
XNamespace xns = @"http://schemas.microsoft.com/winfx/2006/xaml";
XElement someElement = new XElement(ns + "FlowDocument",
                           new XAttribute(xns + "Name", name),
                           ...);