使用XamlWriter保存数组

时间:2012-10-11 13:03:50

标签: c# arrays xaml xamlwriter

我正在尝试以最简单的方式使用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)或者我必须定义自己的包装类型吗?

2 个答案:

答案 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>