环境Microsoft Visual C# 2010 Beta2
2010 集成Silverlight 3开发环境 .net 4.0
根据TerryLee的一步一步学Silverlight 2系列修改
1、建立一个Silverlight 项目
2、建立项目完成后系统会自动产生一个web项目用以运行Silverlight程序
3、Silverlight是客户端程序,我们从服务端开始。使用Handler和WebRequest获取后台数据
Handler代码如下 添加新项 -> 选择 generic handler,生成一个扩展名为ashx的web文件
打开编辑其代码,本例代码如下
view plaincopy to clipboardprint?
public class JBlogHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain;charset=UTF-8";
List<JPost> posts = new List<JPost>(){
new JPost{ Id=1, Title="一步一步学Silverlight 2系列(13):数据与通信之WebRequest", Author="TerryLee" },
new JPost{ Id=2, Title="一步一步学Silverlight 2系列(12):数据与通信之WebClient", Author="TerryLee" },
new JPost{ Id=3, Title="一步一步学Silverlight 2系列(11):数据绑定", Author="TerryLee" },
new JPost{ Id=4, Title="一步一步学Silverlight 2系列(10):使用用户控件", Author="TerryLee" },
new JPost{ Id=5, Title="一步一步学Silverlight 2系列(9):使用控件模板", Author="TerryLee" },
new JPost{ Id=6, Title="一步一步学Silverlight 2系列(8):使用样式封装控件观感", Author="TerryLee" }};
JBlog blog = new JBlog();
blog.Posts = posts;
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(JBlog));
jsonSerializer.WriteObject(context.Response.OutputStream, blog);
}
public bool IsReusable
{
get
{
return false;
}
}
}
public class JBlogHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain;charset=UTF-8";
List<JPost> posts = new List<JPost>(){
new JPost{ Id=1, Title="一步一步学Silverlight 2系列(13):数据与通信之WebRequest", Author="TerryLee" },
new JPost{ Id=2, Title="一步一步学Silverlight 2系列(12):数据与通信之WebClient", Author="TerryLee" },
new JPost{ Id=3, Title="一步一步学Silverlight 2系列(11):数据绑定", Author="TerryLee" },
new JPost{ Id=4, Title="一步一步学Silverlight 2系列(10):使用用户控件", Author="TerryLee" },
new JPost{ Id=5, Title="一步一步学Silverlight 2系列(9):使用控件模板", Author="TerryLee" },
new JPost{ Id=6, Title="一步一步学Silverlight 2系列(8):使用样式封装控件观感", Author="TerryLee" }};
JBlog blog = new JBlog();
blog.Posts = posts;
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(JBlog));
jsonSerializer.WriteObject(context.Response.OutputStream, blog);
}
public bool IsReusable
{
get
{
return false;
}
}
}
DataContractJsonSerializer 对象属于System.Runtime.Serialization.Json 命名空间.net已经内置Json序列化支持
4、实体类
view plaincopy to clipboardprint?
public class JBlog
{
public List<JPost> Posts { get; set; }
}
public class JPost
{
public int Id { get; set; }
public string Title { get; set; }
public string Author { get; set; }
}
public class JBlog
{
public List<JPost> Posts { get; set; }
}
public class JPost
{
public int Id { get; set; }
public string Title { get; set; }
public string Author { get; set; }
}
在这里需要注意一个问题,我们现在有两个项目一个web项目它是基于.net4.0,另外一个Silverlight项目。
在2010Beta2,这两个项目编译的dll对应的.net版本不同,不可以互相引用。估计即使不是beta版该问题也依然存在。
对于本例来说实体类放在Silverlight项目那web项目也引用不到,只能在两个项目中把实体类写两遍。
5、现在开始写Silverlight客户端。2010默认建的程序里有一个页面MainPage.xaml,我们可以修改之,或者另外建一个。
在Silverlight项目右键菜单,添加新项 -> 选择 Silverlight User Control,建一个名为JasonList1.xaml的页面。
view plaincopy to clipboardprint?
<UserControl x:Class="SilverlightDemo1.JasonList1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400" Loaded="UserControl_Loaded">
<Grid >
<Grid.RowDefinitions>
<RowDefinition Height="40" />
<RowDefinition />
</Grid.RowDefinitions>
<Border Grid.Row="0" Grid.Column="0" CornerRadius="15"
Width="240" Height="36" Background="Orange"
Margin="20 0 0 0" HorizontalAlignment="Left">
<TextBlock Text="最新随笔" Foreground="White"
HorizontalAlignment="Left" VerticalAlignment="Center"
Margin="20 0 0 0"></TextBlock>
</Border>
<ListBox x:Name="Posts" Grid.Row="1" Margin="40 10 10 10">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock FontSize="18" Text="{Binding Id}" Height="40" Foreground="Red"></TextBlock>
<TextBlock FontSize="18" Text="{Binding Title}" Height="40"></TextBlock>
<TextBlock FontSize="18" Text="{Binding Author}" Height="40" Foreground="Orange"></TextBlock>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</UserControl>
<UserControl x:Class="SilverlightDemo1.JasonList1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400" Loaded="UserControl_Loaded">
<Grid >
<Grid.RowDefinitions>
<RowDefinition Height="40" />
<RowDefinition />
</Grid.RowDefinitions>
<Border Grid.Row="0" Grid.Column="0" CornerRadius="15"
Width="240" Height="36" Background="Orange"
Margin="20 0 0 0" HorizontalAlignment="Left">
<TextBlock Text="最新随笔" Foreground="White"
HorizontalAlignment="Left" VerticalAlignment="Center"
Margin="20 0 0 0"></TextBlock>
</Border>
<ListBox x:Name="Posts" Grid.Row="1" Margin="40 10 10 10">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock FontSize="18" Text="{Binding Id}" Height="40" Foreground="Red"></TextBlock>
<TextBlock FontSize="18" Text="{Binding Title}" Height="40"></TextBlock>
<TextBlock FontSize="18" Text="{Binding Author}" Height="40" Foreground="Orange"></TextBlock>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</UserControl>
本页用listbox显示一个三列的数据列表
获取数据的代码如下:
view plaincopy to clipboardprint?
SynchronizationContext syn;
public JasonList1()
{
InitializeComponent();
}
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
Uri endpoint = new Uri("http://localhost:4029/JBlogHandler.ashx");
WebRequest request = WebRequest.Create(endpoint);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
syn = SynchronizationContext.Current;
request.BeginGetResponse(new AsyncCallback(ResponseReady), request);
}
void SetPost(object data)
{
JBlog blog = data as JBlog;
Posts.ItemsSource = blog.Posts;
}
void ResponseReady(IAsyncResult asyncResult)
{
WebRequest request1 = asyncResult.AsyncState as WebRequest;
WebResponse response2 = request1.EndGetResponse(asyncResult);
using (Stream responseStream = response2.GetResponseStream())
{
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(JBlog));
JBlog blog = jsonSerializer.ReadObject(responseStream) as JBlog;
syn.Post(SetPost, blog);
}
}
SynchronizationContext syn;
public JasonList1()
{
InitializeComponent();
}
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
Uri endpoint = new Uri("http://localhost:4029/JBlogHandler.ashx");
WebRequest request = WebRequest.Create(endpoint);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
syn = SynchronizationContext.Current;
request.BeginGetResponse(new AsyncCallback(ResponseReady), request);
}
void SetPost(object data)
{
JBlog blog = data as JBlog;
Posts.ItemsSource = blog.Posts;
}
void ResponseReady(IAsyncResult asyncResult)
{
WebRequest request1 = asyncResult.AsyncState as WebRequest;
WebResponse response2 = request1.EndGetResponse(asyncResult);
using (Stream responseStream = response2.GetResponseStream())
{
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(JBlog));
JBlog blog = jsonSerializer.ReadObject(responseStream) as JBlog;
syn.Post(SetPost, blog);
}
}
UserControl_Loaded和winform一样,在空处双击一下就自动生成该函数。
可以看到访问前面写的Handler通过webRequest获取数据,并使用了.net内建的System.Runtime.Serialization.Json命名空间下的DataContractJsonSerializer对象。
另外需要注意的是使用了SynchronizationContext对象,位于System.Threading命名空间,这个是解决跨线程访问UI对象的问题。
对此没有概念的用户可能会对使用syn.Post(SetPost, blog) 这种方法绑定感到莫名其妙,为什么不直接
Posts.ItemsSource = blog.Posts而要转去syn.Post(SetPost, blog) 呢。
6、下了一个开源项目Jason.net,不过试用不了还是版本的问题。也就是说Silverlight可能会使用一个.net 2.0的精简版本吧,反正它和一般的.net程序使用FrameWork就是不能共用。这还是个问题,不过对于序列化功能,.net已经内建Json序列化,Silverlight也同样,这倒是个好事。所以本例并没有用到第三方的Jason.net。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/rex0y/archive/2010/02/08/5298804.aspx