2011-01-25 68 views
2

我有一個數據集合需要轉換爲.xaml文件,稍後可以將其作爲FlowDocument加載到FlowDocumentReader中。我不直接實例化Paragraphs,Runs,而是生成xaml以稍後創建文檔。使用XmlWriter寫出帶名稱空間的FlowDocument xaml

我已經試過什麼:

我通過數據重複,段落創建XElements,運行,InlineUIContainers等,並建立了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">

然後,它會加載就好了。

當創建的XElement的FlowDocument的,我試着這樣做:

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

但是,這並不工作,要麼 - 如果我試圖創建命名空間屬性給我一個錯誤。

我完全可以欺騙和東西,的xmlns入元素,然後調用類似

File.WriteAllText("output.xaml", fixedTxt); 

但感覺髒,所以我想我只是簡單的做是錯誤的。

想法?


更新:

雖然這可能不是指令性的解決問題的方法,它確實工作:

通過添加ParserContext到XamlReader,我是能夠通過加載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

嘗試使用XamlWriter而不是XmlWriter

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), 
          ...);