通过配置XamlObjectWriter和命名空间(不能使用XmlnsDefinitionAttribute)

时间:2014-12-01 21:34:12

标签: c# wpf xaml portable-class-library

我使用Systeml.Xaml创建基于XAML的自定义布局引擎。由于它是跨平台的,95%的类型是在便携式类库中定义的,因此无法使用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,但它不起作用:(

1 个答案:

答案 0 :(得分:1)

您是否考虑过使用程序集级别XmlnsDefinitionAttribute?它允许您定义一个映射到一个或多个程序集中的多个CLR名称空间的xmlns。 谢谢,Rob