我正在尝试以最简单的方式使用XamlWriter
保存对象集合。出于某种原因,将它们保存为数组会产生无效的XML:
var array = new int[] {1, 2, 3};
Console.Write(XamlWriter.Save(array));
输出:
<Int32[] xmlns="clr-namespace:System;assembly=mscorlib">
<Int32>1</Int32>
<Int32>2</Int32>
<Int32>3</Int32>
</Int32[]>
尝试使用XamlReader
抛出此内容:
'['字符,十六进制值0x5B,不能包含在a中 名称。第1行,第7位
我尝试将其保存为List<T>
,但我得到了通常的XAML泛型错误。有一些简单的方法可以做到(最好用LINQ)或者我必须定义自己的包装类型吗?
答案 0 :(得分:3)
XamlWriter.Save
生成无效的XML。
<Int32[] xmlns="clr-namespace:System;assembly=mscorlib">
<Int32>1</Int32>
<Int32>2</Int32>
<Int32>3</Int32>
</Int32[]>
我不知道背后的原因,但使用XamlServices.Save
似乎可以解决问题。
<x:Array Type="x:Int32" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<x:Int32>1</x:Int32>
<x:Int32>2</x:Int32>
<x:Int32>3</x:Int32>
</x:Array>
来自MSDN
的其他说明WPF程序集和 .NET Framework 4中的
System.Xaml
程序集:
XamlReader
XamlWriter
XamlParseException
WPF实现位于
System.Windows.Markup
命名空间和PresentationFramework
程序集中。
System.Xaml
实施位于System.Xaml
命名空间。如果您使用的是WPF类型或者是从WPF类型派生的,那么您应该这样做 通常使用WPF实现
XamlReader
和XamlWriter
而不是System.Xaml
实现。有关详细信息,请参阅中的备注
System.Windows.Markup.XamlReader
和System.Windows.Markup.XamlWriter
答案 1 :(得分:1)
使用UIElementCollection
而不是数组怎么样? UIElementCollection
很好地序列化:
var buttonArray = new Button[] { new Button(), new Button() };
var root = new FrameworkElement();
var collection = new UIElementCollection(root, root);
foreach(var button in buttonArray)
collection.Add(button);
Console.Write(XamlWriter.Save(collection));
给你:
<UIElementCollection Capacity="2" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Button />
<Button />
</UIElementCollection>