概述
Silverlight 2 Beta
1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#,
IronRuby, Ironpython,对JSON、Web
Service、WCF以及Sockets的支持等一系列新的特性。《一步一步学Silverlight 2系列》文章将从Silverlight
2基础知识、数据与通信、自定义控件、动画、图形图像等几个方面带您快速进入Silverlight 2开发。
本文将简单介绍在Silverlight 2中如何与ASMX进行通信。
简单示例
本文的示例非常简单,其过程也跟我们在一步一步学Silverlight 2系列(14):数据与通信之WCF中差不多,我们仍然显示一个最新随笔的列表,最终完成后效果如下所示:ITPUB个人空间;P??*@*|5{

0Od`"{:clm0
定义一个业务实体Post。
public classPost
(^8ULM-A9@b2k0{ITPUB个人空间c'wNWs
public intId {get;set; }ITPUB个人空间qH2Ab lY
B-T^H Qe,p8R0public stringTitle {get;set; }ITPUB个人空间N+b__
\ s2L F
r/?J
.l7s [c8U%^B ai9p0public stringAuthor {get;set; }ITPUB个人空间%U@fz)JG
}
在Web项目中添加一个Web Service文件,命名为BlogService.asmx

实现该服务,定义一个GetPosts方法:
public classBlogService:WebService
t d'i8H Zn#v?S0{
GtT)V*EdgH0[WebMethod]
w-PM&{"n4i
TjK0publicPost[] GetPosts()
g|se+}T ZxX0{ITPUB个人空间X F r4uWu8sO
|
List<Post> posts =newList<Post>()ITPUB个人空间}M/R5i^O'T
{ITPUB个人空间sMj,I8tHe9bb"T
newPost{ Id=1, Title="一步一步学Silverlight 2系列(13):数据与通信之WebRequest", Author="TerryLee"},
eVhNPx0newPost{ Id=2, Title="一步一步学Silverlight 2系列(12):数据与通信之WebClient", Author="TerryLee"},ITPUB个人空间s7C.YX3oai8mB
newPost{ Id=3, Title="一步一步学Silverlight 2系列(11):数据绑定", Author="TerryLee"},ITPUB个人空间
]q|p%RExT
newPost{ Id=4, Title="一步一步学Silverlight 2系列(10):使用用户控件", Author="TerryLee"},
I GA ~,X"x m)eMBU0newPost{ Id=5, Title="一步一步学Silverlight 2系列(9):使用控件模板", Author="TerryLee"},
`Qa"SQ(j*v0newPost{ Id=6, Title="一步一步学Silverlight 2系列(8):使用样式封装控件观感", Author="TerryLee"}ITPUB个人空间9Pv2R6n)a%M$_x
};ITPUB个人空间[ \3n
nB2u'I.V
on;ts*g1X5^zH0returnposts.ToArray();
&Hq*Y m@8Y0}ITPUB个人空间 f0e&gjI`Uu$R
}
同样设置Web Development Server的端口号为一个固定值,这里设为8081,然后在浏览器中测试服务是否正确:
@
gZN.Nwv({0
ITPUB个人空间(w"G,JG {U
nF"nZ
Y[
点击调用后测试服务正确
+OvS[4vd,zc(y#?0
%fPPX\ p,d[0在Silverlight项目中,添加对服务引用,
5C
J6S5B4YM6Wr*U&?K
AJ)L0
ITPUB个人空间N+zXE D
X!C4OKC(e*?
使用对象浏览器查看一下生成客户端代理类中的对象:ITPUB个人空间}'l}:d*M

Y
H#o I jY"Y0
编写展示界面,XAML如下,与上一篇中的示例一样:
<GridBackground="#46461F">ITPUB个人空间GMoax Ec
<Grid.RowDefinitions>
)R0`
m\FU0<RowDefinitionHeight="40"></RowDefinition>ITPUB个人空间;y^1p7H&e
<RowDefinitionHeight="*"></RowDefinition>ITPUB个人空间DB&D!nspIoqN
</Grid.RowDefinitions>
S)U}\-JZI0<Grid.ColumnDefinitions>ITPUB个人空间y"EJv-\{x/pO
<ColumnDefinition></ColumnDefinition>ITPUB个人空间)iS$x"S0f%])R"v\ W*J
</Grid.ColumnDefinitions>ITPUB个人空间PN-A"Ifk6jHg
<BorderGrid.Row="0"Grid.Column="0"CornerRadius="15"
9Y {d8a4g;Eg(YT0Width="240"Height="36"Background="Orange"
U
_
rF E-O0Margin="20 0 0 0"HorizontalAlignment="Left">
/Qf @/| H B0<TextBlockText="最新随笔"Foreground="White"ITPUB个人空间?t2DU-uJc5z
HorizontalAlignment="Left"VerticalAlignment="Center"
R^$c/d5D$| v0Margin="20 0 0 0"></TextBlock>ITPUB个人空间] Zlz1k[
</Border>ITPUB个人空间B-B+k8qM0p
<ListBoxx:Name="Posts"Grid.Row="1"Margin="40 10 10 10">
2N
k7u(ly'`}}A0<ListBox.ItemTemplate>ITPUB个人空间o)j$F-h6qW
<DataTemplate>ITPUB个人空间!c9P8d iE?+L6n\?
g
<StackPanelOrientation="Horizontal">ITPUB个人空间.]
v{J)iJ
<TextBlockText="{BindingId}"Height="40"Foreground="Red"></TextBlock>
1LR*mLom&mZN5T;X0<TextBlockText="{BindingTitle}"Height="40"></TextBlock>ITPUB个人空间Q1@DT,@Y$y#Ix
<TextBlockText="{BindingAuthor}"Height="40"Foreground="Orange"></TextBlock>ITPUB个人空间,y/j\:e
g6l4\!b&MR
</StackPanel>
m3v{*~6lmR0</DataTemplate>ITPUB个人空间t,zB%@-[ l
</ListBox.ItemTemplate>ITPUB个人空间/i-x&p
g|~@
</ListBox>
Xb1aMoy0^J
~0</Grid>
实现调用ASMX,并进行数据的绑定。仍然采用异步模式,所使用的方法如上图中红色框中的部分。过程与WCF通信差不多,只不过不再需要指定Bingding等信息:
public partial classPage:UserControl
xacT,m#F[0{ITPUB个人空间
vH q[aK1a$j@A
publicPage()
7DL5y7[UHQTg0{ITPUB个人空间k!W^D"B
InitializeComponent();
!e/c:@]iU"p0}ITPUB个人空间)]%\2es3i N{$Y'T
ITPUB个人空间~t2?$ZD-vl
??
private voidUserControl_Loaded(objectsender,RoutedEventArgse)ITPUB个人空间lgWL'z)iF]5]5l
{
bv+lm/t e0BlogServiceSoapClientclient =newBlogServiceSoapClient();ITPUB个人空间9q
M0Rn0[+`V7x1`
client.GetPostsCompleted +=newEventHandler<GetPostsCompletedEventArgs>(client_GetPostsCompleted);
OY x4vy%v0client.GetPostsAsync();
6|Xgvj#m-^0}ITPUB个人空间V-OL1f&wC
ITPUB个人空间C*vd \e;KV-I"P7O
voidclient_GetPostsCompleted(objectsender,GetPostsCompletedEventArgse)ITPUB个人空间F^l"`f2Q7S
{
Tyn1nv6C"[Z0if(e.Error ==null)ITPUB个人空间;R!Fx?P7I
{ITPUB个人空间F2s}v&aW3`-D
Posts.ItemsSource = e.Result;ITPUB个人空间u*|'N4]K1\^
V
}ITPUB个人空间 w4N8KQ&ZF,R
}ITPUB个人空间
f2|u'z8rvc
}
一个完整的Silverlight 2中调用ASMX的示例就完成了,运行后效果如下:
)R*s^s%c!_r9E9K0结束语
本文简单介绍了在Silverlight 2中如何调用ASMX,你可以从这里下载示例代码。
,N+v
w5wF0