使用XamlReader加载带有xml的xaml时出现的奇怪问题:space =“preserve”

时间:2012-05-07 10:49:42

标签: c# silverlight xaml xamlreader

我发现一个非常奇怪的问题,何时使用XamlReader从预定义的xaml文件加载我的应用程序的菜单。 我需要定义xml:space="preserve"的属性,xaml是这样的:

<m:MenuManager>
   ...
    <m:Resource>
        <m:Resource.ResourceTitle>
            <sys:String xml:space="preserve">Click the Button&#xA;(InvokeCommandAction)&#xA;View</sys:String>
        </m:Resource.ResourceTitle>
    </m:Resource>
...
</m:MenuManager>

将xaml内容加载到字符串并使用XamlReader.Load将其转换为MenuManager对象。当第一次调用XamlReader.Load方法时,它只返回标记<sys:String xml:space="preserve">中的单词,而预期结果仅在第二次返回。

        var uri = new Uri("/Sample;component/Assets/Menu.xaml", UriKind.Relative);
        var info = Application.GetResourceStream(uri);
        string xaml = null;
        using (StreamReader reader = new StreamReader(info.Stream))
        {
            xaml = reader.ReadToEnd();
        }
        //when the first time load, only a string value of
        //"Click the Button&#xA;(InvokeCommandAction)&#xA;View" is returned
        var temp1 = XamlReader.Load(xaml); 

        //when the second time load, all menu content loaded successfully and
        //converted to the object of MenuManager 
        readXaml = XamlReader.Load(xaml) as MenuManager;

当我删除属性xml:space="preserve"或将其更改为xml:space="default"时,它会正常工作,我只能通过调用方法XamlReader.Load获取MenuManager的对象。但我真的需要保留我页面上的空白,这里的代码看起来很奇怪。有人可以解释一下吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

如果您不想将xml:space="preserve"添加到所有元素,则可以将此附加参数用于XamlReader.Load

XamlReader.Load(xaml, new ParserContext() { XmlSpace = "preserve" });