我正在尝试以最简单的方式保存带有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)不能包含在 名字。第 1 行,第 7 位置
我尝试另存为List<T>
,但出现通常的 XAML 泛型错误。是否有一些简单的方法可以做到这一点(最好使用 LINQ),或者我是否必须定义自己的包装器类型?
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
.
使用 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>