【问题标题】:Writing out FlowDocument xaml with namespace using XmlWriter使用 XmlWriter 用命名空间写出 FlowDocument xaml
【发布时间】:2011-01-25 15:52:27
【问题描述】:

我有一组需要转换为 .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 并将元素修改为:

&lt;FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Name="testDoc"&gt;

然后加载就好了。

在为 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();

【问题讨论】:

    标签: wpf xaml flowdocument flowdocumentreader


    【解决方案1】:

    尝试使用XamlWriter 而不是XmlWriter

    【讨论】:

      【解决方案2】:

      如果您使用 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),
                                 ...);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多