2014-12-01 29 views
1

我使用Systeml.Xaml創建基於XAML的自定義佈局引擎。由於它是跨平臺的,95%的類型在便攜類庫中定義,所以不可能使用XmlnsDefinitionAttribute來「裝飾」默認程序集。XamlObjectWriter和命名空間通過配置(不能使用XmlnsDefinitionAttribute)

我想使用XamlReader來讀取我的XAML格式的文件。問題是我的對象屬於幾個名稱空間。目前,如果我想XamlReader能夠實例化每一個,我必須指定從命名空間的每個對象是這樣的:

<Window Title="Title" xmlns="clr-namespace:Perspex.Win32;assembly=Perspex.Win32" 
    xmlns:r="clr-namespace:Perspex;assembly=Perspex.Base"> 
    <Window.Content> 
     <TextBlock xmlns="clr-namespace:Perspex.Controls;assembly=Perspex.Controls" Text="{r:Binding}" />  
    </Window.Content>  
</Window> 

我怎樣才能讓XamlReader有一組默認命名那是隱含的,所以它們在沒有指定名稱空間的情況下被發現?

編輯:我現在的代碼是這樣的。我在XamlXmlReader中使用它來完成它。

private static object Load(XmlReader reader) 
    {   
     XamlXmlReader xamlXmlReader = new XamlXmlReader(reader, xamlSchemaContext); 
     XamlObjectWriter writer = new XamlObjectWriter(
      xamlSchemaContext, 
      new XamlObjectWriterSettings 
      { 
       XamlSetValueHandler = SetValue,           
      }); 

     while (xamlXmlReader.Read()) 
     { 
      writer.WriteNode(xamlXmlReader); 
     } 

     object result = writer.Result; 

     return result; 
    } 

正如你所看到的,我試着用一些默認組件一個XamlSchemaContext,但它不工作:(

+0

如何使用[XamlReader.Load](http://msdn.microsoft.com/zh-cn/library/ms590393(v = vs.110).aspx)使用ParserContext參數的重載,該參數具有[XmlnsDictionary](http://msdn.microsoft.com/zh-cn/library/system.windows.markup.parsercontext.xm lnsdictionary(v = vs.110).aspx)屬性? – Clemens 2014-12-01 21:40:26

+0

對不起,我忘了說:我正在使用XamlXmlReader。看看編輯過的問題。我將發佈我現有的代碼。感謝你的回答! – SuperJMN 2014-12-01 21:52:13

+0

@Clemens似乎它在過去像那樣工作。 XmlnsDictionary是不再適用於.NET 4.0和更新版本的ParserContext的一部分。像XamlObjectWriter這樣的對象會得到一個XamlSchemaContext :(不幸的是,這個文檔並沒有提供太多關於它的信息 – SuperJMN 2014-12-02 12:08:12

回答

1

你有沒有考慮過使用裝配水平XmlnsDefinitionAttribute?它允許你定義一個xmlns映射到一個或多個程序集中的幾個CLR命名空間。 謝謝,Rob

+0

不幸的是,我們需要「膨脹」(讀取)的元素是在可移植類庫中定義的,我們不能使用這個屬性,因爲它是不是PCL的.NET子集的一部分:( – SuperJMN 2014-12-02 20:31:04