在 Silverlight 中,有几种获取后台数据的方式。 通过会有一个Service来暴露这些数据,对于sl2 这个service可以是最简单的ASMX或者用WCF的basichttpbinding, 您可以通过添加引用来生成代理,来适用这个service。
如果只是简单的数据的话,你也可以通过访问一个远程的XML文件来获取这些数据,拿到XML之后,需要把他转换成对象。也有几种方式
- 用xmlReader
- 用LinqForXml
- 用系统解析XAML的方式,也就是本文中提到的方式。其实是最简单的一种方式。
思路:
首先定义个对像,我们知道在WPF/Silverlight 的class Resource中可以加入资源,资源可以是任意的对象。
而在程序中,可以通过访问资源Key的方式拿到这些对象。事实上,他拿这些对象的时候,就是适用一个简单的XamlReader来反序列化之。
一下是一个简单的Demo
假定有一下Class
Code
namespace WpfApplication1
{
public class Person
{
public int Age { get; set; }
public string Name { get; set; }
public Address ShippingAddress {get;set;}
}
public class Address
{
public string FirstLine { get; set; }
public int Zipcode { get; set; }
}
}
这时候你可以在resource中,加上一个自己的xmlns前缀,指向这个class所有的namespace和assembly
比如在Xaml中你可以这样些,这时候有很好的智能提示。
Code
<Application x:Class="WpfApplication1.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="Window1.xaml"
xmlns:Obj="clr-namespace:WpfApplication1">
<Application.Resources>
<Obj:Person x:Key="hello">
<Obj:Person.Name>Hello</Obj:Person.Name>
<Obj:Person.Age>30</Obj:Person.Age>
<Obj:Person.ShippingAddress>
<Obj:Address>
<Obj:Address.FirstLine>FirstLine</Obj:Address.FirstLine>
<Obj:Address.Zipcode>91792</Obj:Address.Zipcode>
</Obj:Address>
</Obj:Person.ShippingAddress>
</Obj:Person>
</Application.Resources>
</Application>
然后我们新建一个xml文件,把我们写好的xaml copy进去。删掉一些不必要的属性,不如Key。 和 class
变成一下xml
Code
<?xml version="1.0" encoding="utf-8" ?>
<Obj:Person xmlns:Obj="clr-namespace:WpfApplication1;assembly=WpfApplication1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
<Obj:Person.Name>Hello</Obj:Person.Name>
<Obj:Person.Age>30</Obj:Person.Age>
<Obj:Person.ShippingAddress>
<Obj:Address>
<Obj:Address.FirstLine>FirstLine</Obj:Address.FirstLine>
<Obj:Address.Zipcode>91792</Obj:Address.Zipcode>
</Obj:Address>
</Obj:Person.ShippingAddress>
</Obj:Person>
然后用一下简单的代码就可以反序列化得到对象的访问。
Code
XamlReader readr = new XamlReader();
Person o=readr.LoadAsync(
new System.IO.FileStream(
@"r:\WpfApplication1\WpfApplication1\XMLFile1.xml",
FileMode.Open )) as Person;
;
如果是Sl, 把LoadAsyc改为Load就可以了。
如果正式应用的话,可以把Xml放在服务端,然后通过webclient download,然后调用以上代码做反序列化。
然后你就可以做正常的binding,Animation了,当然要正常工作的话,属性要改为DependencyProperty