.NEt专家博客!

【李会军】一步一步学Silverlight 2系列(18):综合实例之RSS阅读器

上一篇 / 下一篇  2008-04-11 20:25:30

概述

Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, Ironpython,对JSON、Web Service、WCF以及Sockets的支持等一系列新的特性。《一步一步学Silverlight 2系列》文章将从Silverlight 2基础知识、数据与通信、自定义控件、动画、图形图像等几个方面带您快速进入Silverlight 2开发

本文将综合前面十七篇讲过的界面布局、样式、控件模板、数据绑定、网络通信等几个方面,来开发一个综合实例——简易RSS阅读器。

界面布局

我们最终完成的RSS阅读器界面如下:
:hSr F:A8x0
yJLx c0

定义一个三行两列的Grid,分别放置顶部信息、分割线和下面的内容区:

<Grid.RowDefinitions>
5\1`m {:cW0<
RowDefinitionHeight="50"></RowDefinition>ITPUB个人空间#Br4SzoA+n#x
<
RowDefinitionHeight="20"></RowDefinition>ITPUB个人空间 d;z4Yh)d
<
RowDefinitionHeight="*"></RowDefinition>ITPUB个人空间m@7C2g:@J$SF
</
Grid.RowDefinitions>ITPUB个人空间Gnv9J kN
<
Grid.ColumnDefinitions>
.v*j+e`ky#P(s;r0<
ColumnDefinitionWidth="240"></ColumnDefinition>ITPUB个人空间h4W5V4pl`"Y5{N
<
ColumnDefinitionWidth="*"></ColumnDefinition>
#_dc*m;`4AzR0</
Grid.ColumnDefinitions>

设计顶部输入区域,对Grid第一行做合并,并且放置一个StackPanel:

<StackPanelx:Name="Header"Orientation="Horizontal"ITPUB个人空间0z!F#r#r7mP
Grid.Row="0"Grid.Column="0"Grid.ColumnSpan="2">
fG#LbwTl0<
ImageSource="Rss.png"Width="32"Height="32"Margin="10 0 10 0"></Image>ITPUB个人空间.mk-K)cF'a]EM @
<
BorderStyle="{StaticResourcetitleBorder}">
z,sw\#U `'s VR'k F0<
TextBlockText="基于Silverlight的RSS阅读器"Foreground="#FFFFFF"ITPUB个人空间n)CI.Ci5k5^5f
VerticalAlignment="Center"Margin="12 0 0 0"></TextBlock>ITPUB个人空间/?V!b'gMo m0Ky
</
Border>ITPUB个人空间b \;]S&G{0k
<
WatermarkedTextBoxx:Name="feedAddress"Width="300"Height="35"ITPUB个人空间2xK`MHj
FontSize="16"Margin="10 0 10 0">ITPUB个人空间G4R1A~0K _
<
WatermarkedTextBox.Watermark>
3uD["if/L0<
TextBlockText="请输入有效的RSS地址"VerticalAlignment="Center"
+DYyzYJ Hx(I0
Foreground="#FBA430"FontSize="16"></TextBlock>ITPUB个人空间h @6scdzHY f
</
WatermarkedTextBox.Watermark>
C+k"K|7o PxS:o b Mv0</
WatermarkedTextBox>ITPUB个人空间J(vT3HuuF v
<
Buttonx:Name="displayButton"Style="{StaticResourcebutton}"ITPUB个人空间Jf-F&P!L
Content="显 示"Click="displayButton_Click"></Button>
s}XY?4h0<
Buttonx:Name="fullScreenButton"Style="{StaticResourcebutton}"ITPUB个人空间6D,j0N?)v-Y"mnib
Content="全 屏"Click="fullScreenButton_Click"></Button>
W{uRt9DS`~0</
StackPanel>

鉴于两个按钮的风格一致,在App.xaml中定义一个button样式:

<Style.x:Key="button"TargetType="Button">ITPUB个人空间*\|a:c]*t2Z5]\3~
<
SetterProperty="Width"Value="100"></Setter>
+X6Jk7Ihr |1cp0<
SetterProperty="Height"Value="35"></Setter>
(CG E_{/Z4` _0<
SetterProperty="Background"Value="#FBA430"></Setter>ITPUB个人空间3B ^vBvh o~
<
SetterProperty="Foreground"Value="#FBA430"></Setter>
-cJ~#g-ES"A0@vP0<
SetterProperty="FontSize"Value="16"></Setter>
5{ ZKjS8@m0</
Style>ITPUB个人空间5bx"L9lY$L
<
Style.x:Key="titleBorder"TargetType="Border">
4rKMx&B1v4wi0<
SetterProperty="CornerRadius"Value="10"></Setter>ITPUB个人空间+Z+d(D[G&F]T
<
SetterProperty="Width"Value="220"></Setter>ITPUB个人空间 kV:a Xmt5]
<
SetterProperty="Height"Value="40"></Setter>
2x7bW|\{,J0<
SetterProperty="Background">ITPUB个人空间-}.L4G G*HX
<
Setter.Value>
4A7S U3Q#_9^:n#h0<
LinearGradientBrushStartPoint="0,0">
2m6G5P%kOF&V'sC0<
GradientStopColor="#FBA430"Offset="0.0" />
,_O2H#{kX1b0<
GradientStopColor="#FEF4E7"Offset="0.5" />
N(u\&^zp0<
GradientStopColor="#FBA430"Offset="1.0" />ITPUB个人空间:lFw%wZ0`
</
LinearGradientBrush>
$p h-Hv5ho0</
Setter.Value>
Wd&KF&b0</
Setter>
-i!] w2nu0</
Style>
定义分割线,用Rectangle来表示:
<StackPanelGrid.Row="1"Grid.Column="0"Grid.ColumnSpan="2"VerticalAlignment="Center">ITPUB个人空间u%f/w,Ex^VR?
<
RectangleStyle="{StaticResourcerectangle}"/>ITPUB个人空间7ZT[ zhH+C/@w
</
StackPanel>

为了显示出渐变的样式,我们定义样式如下:

<Style.x:Key="rectangle"TargetType="Rectangle">ITPUB个人空间6b$]]dM0WIN
<
SetterProperty="Width"Value="780"></Setter>ITPUB个人空间u;Fr!v2A\
<
SetterProperty="Height"Value="5"></Setter>
-o T*Ld!?B#h0<
SetterProperty="RadiusX"Value="3"></Setter>ITPUB个人空间/h-Fp9T6p J @*kA#T|U
<
SetterProperty="RadiusY"Value="3"></Setter>ITPUB个人空间 ImH/I+_l7[;w
<
SetterProperty="Fill">ITPUB个人空间p]AR{2\/f5q
<
Setter.Value>
;I T0jZB(k2j0<
LinearGradientBrushStartPoint="0,0">
@;i%G8{.cT0<
GradientStopColor="#FEF4E7"Offset="0.0" />ITPUB个人空间!~,k;~Yn9I/I!{E6s
<
GradientStopColor="#FBA430"Offset="1.0" />
6P!~1I)q*D0</
LinearGradientBrush>ITPUB个人空间*y Q~;t_ M)A
</
Setter.Value>
B\,Q+MH{JO V V}0</
Setter>ITPUB个人空间V%P0^W#I
</
Style>
定义左边的列表区,用ListBox来显示,并且定义ItemTemplate:
<ListBoxx:Name="PostsList"Grid.Column="0"Grid.Row="2"ITPUB个人空间7\e P
K~:x$kR`1x6U
Margin="10 5 5 10"SelectionChanged="PostsList_SelectionChanged">
6F2C@/Pe0<
ListBox.ItemTemplate>ITPUB个人空间\M0p0c1dA?3t
<
DataTemplate>
h `8R6c-H0<
TextBlockText="{BindingTitle.Text}"
1w9_3^/~o;i0
TextWrapping="Wrap"Width="200"/>ITPUB个人空间bD#{e}p["{P3hB)t
</
DataTemplate>
.G.a!D-wB_0</
ListBox.ItemTemplate>ITPUB个人空间9ho#zWe c|
</
ListBox>

最后定义右边的详细信息区域,在StackPanel中垂直放置三个Border:

<StackPanelx:Name="Detail"Grid.Column="1"Grid.Row="2">ITPUB个人空间+cKx-i,a5n(j+O
<
BorderCornerRadius="10"Background="#CDFCAE"Margin="10 5 10 10"ITPUB个人空间4e)J6{bc dA#f+U*\
Width="540"Height="40">ITPUB个人空间9D!w%^.G!A3j3Z
<
TextBlockText="{BindingTitle.Text}"TextWrapping="Wrap"
U.H)x"Y lo6C0
VerticalAlignment="Center"Foreground="Red"/>
)A%X)K$`]0</
Border>
[%A6Z@Vx/HG0<
BorderCornerRadius="10"Background="#CDFCAE"Margin="10 5 10 10"
[!W+q2u{4T't@ u5L0O1U0
Width="540"Height="300">
@eR+E-a-? J-x$`0<
TextBlockText="{BindingSummary.Text}"TextWrapping="Wrap"/>ITPUB个人空间j3l'W \r O9{Fo_-M
</
Border>
/K&BJ$y0x+t\w0<
BorderCornerRadius="10"Background="#CDFCAE"Margin="10 5 10 10"ITPUB个人空间,Xj$^ru
Width="540"Height="40">ITPUB个人空间i] AtLv[
<
StackPanelOrientation="Horizontal">
#~F5i$}m0<
TextBlockText="评论日期:"TextWrapping="Wrap"ITPUB个人空间5Teh&_OxY0{|(@#O
Foreground="Red"VerticalAlignment="Center"/>
v^_J_L0<
TextBlockText="{BindingPublishDate}"TextWrapping="Wrap"
,^Ef EZb$Lq0
Foreground="Red"VerticalAlignment="Center"/>
{Y{KjM)oV^h0</
StackPanel>
4Se`q|Utl0</
Border>
;h!]\-x@F-BKx,yk0</
StackPanel>

界面布局到此大功告成。

实现功能

下面实现数据的获取,采用WebRequest来实现,也可以使用其他方式。

/// <summary>
jNC X:Y0///
显示列表
qG X;G6De9z M6?Q:PI#Z$M0
/// </summary>ITPUB个人空间gh|*j1l0}
/// <param name="sender"></param>ITPUB个人空间LN$H4gS
/// <param name="e"></param>
(j2]7`"Qg,T0
private voiddisplayButton_Click(objectsender,RoutedEventArgse)
3s#rr(V+N,C0{
](k5t6p z m7kyT0Uriuri =newUri(feedAddress.Text);
%_E[@+LJ(]0WebRequestrequest = (WebRequest)WebRequest.Create(uri);
9zGX\$z @^ jQ`0request.BeginGetResponse(newAsyncCallback(responseReady), request);ITPUB个人空间X1V ]$K A5m9CL2S&uW
}
YY] b&Ip0
b/r4k5\ q:ic4PL0voidresponseReady(IAsyncResultasyncResult)
7ZeWZT.B0?o0{
)t z~O-O3{3RuA2F0WebRequestrequest = (WebRequest)asyncResult.AsyncState;ITPUB个人空间b$]HA2COZ
WebResponseresponse = (WebResponse)request.EndGetResponse(asyncResult);ITPUB个人空间$B%lY0j*n`

ai8l^*p%F|$[C.`0XmlReaderreader =XmlReader.Create(response.GetResponseStream());ITPUB个人空间`-FC U!I hG
SyndicationFeedfeed =SyndicationFeed.Load(reader);
y?)G|#d0ITPUB个人空间AN2a&t%L$^5Jm&lZ
PostsList.ItemsSource = feed.Items;ITPUB个人空间wGJ+U!c,mI9~ Sa
}

显示详细信息:

/// <summary>
4Tfh1O7~;m4Gv_0///
查看详细信息
8B@v:Vj5WO0
/// </summary>
7M]Ne9UQ,N:oe0/// <param name="sender"></param>
oak~ saN0/// <param name="e"></param>
N})yU N%{0
private voidPostsList_SelectionChanged(objectsender,SelectionChangedEventArgse)
Qf"YZ"vXmi0{
;l)vC4[2NW/K'jG!q0SyndicationItemitem = PostsList.SelectedItemasSyndicationItem;ITPUB个人空间 c5@5W9p"x)[3x a u2ab

AN*T-P Y |.V"D{4@0Detail.DataContext = item;
1[7^b)Ou5v?0}

实现全屏按钮的代码:

/// <summary>
"b`4GDP J0///
全屏显示ITPUB个人空间1?+yB)B1r} r;rT
/// </summary>
^2fjd6@n.F!P0/// <param name="sender"></param>ITPUB个人空间w\Gqa QzgP_
/// <param name="e"></param>
Qc$~ECl2_,U%`0
private voidfullScreenButton_Click(objectsender,RoutedEventArgse)ITPUB个人空间UeAE{G
{
s#d:u f:g#~0ContentcontentObject =Application.Current.Host.Content;ITPUB个人空间kVd6s0?A
contentObject.IsFullScreen = !contentObject.IsFullScreen;ITPUB个人空间-h/C7Q.k o TV
}

运行效果

运行后界面如下:


!O:c4S5a$l"?9\0输入豆瓣的最新影评Feed:
cO*Q]v$`}6W0^0选择其中一项后,将显示出详细信息:
w*R!cD%U,o$_q0
p;bf|?0

结束语

本文对前面十七篇内容做了一个小结,并开发出了一个简易RSS阅读器,你可以从这里下载本文示例代码。

作者:TerryLeeITPUB个人空间h+LZUm n"o:p2R
出处:http://terrylee.cnblogs.com

*~,s,p:za*q0

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar