`
bolutes
  • 浏览: 869323 次
文章分类
社区版块
存档分类
最新评论

第18课 综合实例之RSS阅读器

 
阅读更多

概述

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阅读器界面如下:

TerryLee_Silverlight2_0082

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

Grid.RowDefinitions>
    RowDefinition Height="50">RowDefinition>
    RowDefinition Height="20">RowDefinition>
    RowDefinition Height="*">RowDefinition>
Grid.RowDefinitions>
Grid.ColumnDefinitions>
    ColumnDefinition Width="240">ColumnDefinition>
    ColumnDefinition Width="*">ColumnDefinition>
Grid.ColumnDefinitions>

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

StackPanel x:Name="Header" Orientation="Horizontal"
             Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2">
    Image Source="Rss.png" Width="32" Height="32" Margin="10 0 10 0">Image>
    Border Style="{StaticResource titleBorder}">
        TextBlock Text="基于Silverlight的RSS阅读器" Foreground="#FFFFFF"
                   VerticalAlignment="Center" Margin="12 0 0 0">TextBlock>
    Border>
    WatermarkedTextBox x:Name="feedAddress" Width="300" Height="35"
                        FontSize="16" Margin="10 0 10 0">
        WatermarkedTextBox.Watermark>
            TextBlock Text="请输入有效的RSS地址" VerticalAlignment="Center"
                       Foreground="#FBA430" FontSize="16">TextBlock>
        WatermarkedTextBox.Watermark>
    WatermarkedTextBox>
    Button x:Name="displayButton" Style="{StaticResource button}"
            Content="显 示" Click="displayButton_Click">Button>
    Button x:Name="fullScreenButton" Style="{StaticResource button}"
            Content="全 屏" Click="fullScreenButton_Click">Button>
StackPanel>

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

Style x:Key="button" TargetType="Button">
    Setter Property="Width" Value="100">Setter>
    Setter Property="Height" Value="35">Setter>
    Setter Property="Background" Value="#FBA430">Setter>
    Setter Property="Foreground" Value="#FBA430">Setter>
    Setter Property="FontSize" Value="16">Setter>
Style>
Style x:Key="titleBorder" TargetType="Border">
    Setter Property="CornerRadius" Value="10">Setter>
    Setter Property="Width" Value="220">Setter>
    Setter Property="Height" Value="40">Setter>
    Setter Property="Background">
        Setter.Value>
            LinearGradientBrush StartPoint="0,0">
                GradientStop Color="#FBA430" Offset="0.0" />
                GradientStop Color="#FEF4E7" Offset="0.5" />
                GradientStop Color="#FBA430" Offset="1.0" />
            LinearGradientBrush>
        Setter.Value>
    Setter>
Style>
定义分割线,用Rectangle来表示:
StackPanel Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" VerticalAlignment="Center">
    Rectangle Style="{StaticResource rectangle}"/>
StackPanel>

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

Style x:Key="rectangle" TargetType="Rectangle">
    Setter Property="Width" Value="780">Setter>
    Setter Property="Height" Value="5">Setter>
    Setter Property="RadiusX" Value="3">Setter>
    Setter Property="RadiusY" Value="3">Setter>
    Setter Property="Fill">
        Setter.Value>
            LinearGradientBrush StartPoint="0,0">
                GradientStop Color="#FEF4E7" Offset="0.0" />
                GradientStop Color="#FBA430" Offset="1.0" />
            LinearGradientBrush>
        Setter.Value>
    Setter>
Style>
定义左边的列表区,用ListBox来显示,并且定义ItemTemplate:
ListBox x:Name="PostsList" Grid.Column="0" Grid.Row="2"
         Margin="10 5 5 10" SelectionChanged="PostsList_SelectionChanged">
    ListBox.ItemTemplate>
        DataTemplate>
            TextBlock Text="{Binding Title.Text}" 
                           TextWrapping="Wrap" Width="200"/>
        DataTemplate>
    ListBox.ItemTemplate>
ListBox>

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

StackPanel x:Name="Detail" Grid.Column="1" Grid.Row="2">
    Border CornerRadius="10" Background="#CDFCAE" Margin="10 5 10 10"
            Width="540" Height="40">
        TextBlock Text="{Binding Title.Text}"  TextWrapping="Wrap"
                   VerticalAlignment="Center" Foreground="Red"/>
    Border>
    Border CornerRadius="10" Background="#CDFCAE" Margin="10 5 10 10"
            Width="540" Height="300">
        TextBlock Text="{Binding Summary.Text}"  TextWrapping="Wrap"/>
    Border>
    Border CornerRadius="10" Background="#CDFCAE" Margin="10 5 10 10"
            Width="540" Height="40">
        StackPanel Orientation="Horizontal">
            TextBlock Text="评论日期:"  TextWrapping="Wrap"
                       Foreground="Red" VerticalAlignment="Center"/>
            TextBlock Text="{Binding PublishDate}"  TextWrapping="Wrap"
                       Foreground="Red" VerticalAlignment="Center"/>
        StackPanel>
    Border>
StackPanel>

界面布局到此大功告成。

实现功能

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

/// <summary>
/// </summary>显示列表
/// 
/// 
/// private void displayButton_Click(object sender, RoutedEventArgs e)
{
    Uri uri = new Uri(feedAddress.Text);
    WebRequest request = (WebRequest)WebRequest.Create(uri);
    request.BeginGetResponse(new AsyncCallback(responseReady), request);
}

void responseReady(IAsyncResult asyncResult)
{
    WebRequest request = (WebRequest)asyncResult.AsyncState;
    WebResponse response = (WebResponse)request.EndGetResponse(asyncResult);

    XmlReader reader = XmlReader.Create(response.GetResponseStream());
    SyndicationFeed feed = SyndicationFeed.Load(reader);

    PostsList.ItemsSource = feed.Items;
}

显示详细信息:

/// <summary>
/// </summary>查看详细信息
/// 
/// 
/// private void PostsList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    SyndicationItem item = PostsList.SelectedItem as SyndicationItem;

    Detail.DataContext = item;
}

实现全屏按钮的代码:

/// <summary>
/// </summary>全屏显示
/// 
/// 
/// private void fullScreenButton_Click(object sender, RoutedEventArgs e)
{
    Content contentObject = Application.Current.Host.Content;
    contentObject.IsFullScreen = !contentObject.IsFullScreen;
}

运行效果

运行后界面如下:

TerryLee_Silverlight2_0080

输入豆瓣的最新影评Feed:

TerryLee_Silverlight2_0081

选择其中一项后,将显示出详细信息:

TerryLee_Silverlight2_0082

结束语

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

分享到:
评论

相关推荐

    PHP+Ajax网站开发典型实例

    PHP+Ajax网站开发典型... 实例79 创建RSS阅读器 实例80 基于prototype框架程序 实例81 基于xajax框架程序 第10章 Ajax实现综合实例 实例82 汇智在线留言板程序 实例83 汇智在线聊天室程序 实例84 汇智在线BBS论坛

    android开发入门与实战(下)

    第12章 Android综合案例一——RSS阅读器实例 12.1 RSS介绍 12.1.1 RSS基础 12.1.2 RSS的历史 12.1.3 RSS语法介绍 12.2 SAX介绍 12.2.1 SAX基础 12.2.2 使用SAX的作用 12.2.3 怎样使用SAX 12.3 RSS阅读器设计 12.3.1 ...

    android开发入门与实战(上)

    第12章 Android综合案例一——RSS阅读器实例 12.1 RSS介绍 12.1.1 RSS基础 12.1.2 RSS的历史 12.1.3 RSS语法介绍 12.2 SAX介绍 12.2.1 SAX基础 12.2.2 使用SAX的作用 12.2.3 怎样使用SAX 12.3 RSS阅读器设计 12.3.1 ...

    《Google Android开发入门与实战》.pdf

    第12章 android综合案例一——rss阅读器实例 205 12.1 rss介绍 205 12.1.1 rss基础 205 12.1.2 rss的历史 205 12.1.3 rss语法介绍 206 12.2 sax介绍 207 12.2.1 sax基础 207 12.2.2 使用sax的...

    Google.Android开发入门与实战

    第12章 Android综合案例一——RSS阅读器实例 12.1 RSS介绍 12.1.1 RSS基础 12.1.2 RSS的历史 12.1.3 RSS语法介绍 12.2 SAX介绍 12.2.1 SAX基础 12.2.2 使用SAX的作用 12.2.3 怎样使用SAX 12.3 RSS阅读器设计 12.3.1 ...

    Google Android开发入门与实战的代码

    第12章 Android综合案例一——RSS阅读器实例 205 12.1 RSS介绍 205 12.1.1 RSS基础 205 12.1.2 RSS的历史 205 12.1.3 RSS语法介绍 206 12.2 SAX介绍 207 12.2.1 SAX基础 207 12.2.2 使用SAX的...

    AJAX基础概念、核心技术与典型案例(内涵动态实例)

    /RSSReader.jsp RSS阅读器 /rss.js JavaScript脚本文件 第25章(/ch25) 程序描述:本章将仿照Google Suggest,使用Ajax技术实现动态获取搜索提示的功能。当输入搜索关键字时,自动向服务器发送请求...

    ASP.NET3.5典型模块开发源代码

    5.4.3 一个复杂的RSS阅读器 67 5.4.4 让站点提供订阅功能 69 5.5 小结 70 第6章 在线编辑模块 71 6.1 在线编辑的原理 71 6.2 编辑器的界面 71 6.3 一个简单的在线编辑器 72 6.3.1 在线编辑窗口的界面...

    asp.net知识库

    技术基础 New Folder 多样式星期名字转换 [Design, C#] .NET关于string转换的一个...C#+ASP.NET开发基于Web的RSS阅读器 ASP.NET RSS Toolkit(RSS工具) Serialize Your Deck with Positron [XML Serialization, XSD, C#]...

    精通JavaScript

    第1章(\第1章) 查看1.2.htm中noscript显示效果的方法如下: 1.将该实例复制到C:\Inetpub\wwwroot下; 2.选择浏览器的“工具”-“安全”-“本地Intranet”-“自定义级别”-“活动脚本”中选用“禁用”单选框 ...

    AJAX 源码范例

    源码结构说明 1.TreeWiewDemo文件夹下为源文件 2.TreeWiewDemo.war为部署文件 &lt;br&gt;第15章 程序描述:本章程序将本章将使用Ajax技术实现无刷新即可浏览RSS新闻的阅读器。 源码结构说明 1....

    亮剑.NET深入体验与实战精要2

    6.6 项目案例2:在线实现RSS阅读器 270 本章常见技术面试题 275 常见面试技巧之经典问题巧回答 275 本章小结 276 第7章 Web Service开发详解 277 7.1 Web Service基本概念 278 7.2 Web Service的应用场景 278 7.3 ...

    亮剑.NET深入体验与实战精要3

    6.6 项目案例2:在线实现RSS阅读器 270 本章常见技术面试题 275 常见面试技巧之经典问题巧回答 275 本章小结 276 第7章 Web Service开发详解 277 7.1 Web Service基本概念 278 7.2 Web Service的应用场景 278 7.3 ...

Global site tag (gtag.js) - Google Analytics