在这篇文章中我们将为 Windows Phone 7 手机创建一个简单的 RSS (Really Simple Syndication) 阅读器。用户界面包含一个文本输入框用于输入 RSS 地址,以及一个 ListBox 用于显示 RSS 条目,如下图所示:

 
下载整个项目打包
项目是详细的步骤: 
1. 创建新项目
首先我们要创建一个新项目,打开 Visual Studio 2010 -> File -> New Project -> 选择 Windows Phone Application ,如下图所示:

2. 为项目增加引用
接下来你需要增加对 Microsoft.Xml.Linq 这个 XML 解析库的应用,右击项目下的引用库,人然后选择添加引用,在 .NET 的 tab 页中你将找到 Microsoft.Xml.Linq, 点击 OK 按钮,如下图所示: 

3. 修改标题
这个步骤不是必须的,但我还是决定加进来,在这个步骤中我们简单的修改 TitleGrid 元素用来指定应用程序的标题
1 | 
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="24,24,0,12">  | 
 
2 | 
    <TextBlock x:Name="ApplicationTitle" Text="EUGENEDOTNET.COM" Margin="0,0,0,0" Style="{StaticResource PhoneTextNormalStyle}"/>  | 
 
3 | 
    <TextBlock x:Name="PageTitle" Text="RSS Reader" Margin="-3,-8,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>  | 
 
  
4. 修改 ContentGrid
ContentGrid 将包含应用程序中所需的 UI 元素,最基本的包括下面三项:
- TextBox 用于输入 RSS 网址
 - Button 用于触发读取 RSS 信息的事件
 - ListBox 用于显示 RSS 数据结果,包含标题和链接
 
需要注意的是按钮的点击事件是通过 XAML 中定义的,另外 Windows Phone 7 有一个新的 InputScope 特性用于简化输入框直接输入 URL 地址后响应回车键。
01 | 
<Grid x:Name="ContentGrid" Grid.Row="1">  | 
 
04 | 
        <RowDefinition Height="70" />  | 
 
05 | 
        <RowDefinition Height="Auto" />  | 
 
06 | 
    </Grid.RowDefinitions>  | 
 
08 | 
    <TextBox Name="tbRSSFeedURL" Grid.Row="0" Text=""  Width="350" Margin="10,0,10,0" HorizontalAlignment="Left">  | 
 
12 | 
                <InputScopeName NameValue="Url" />  | 
 
17 | 
    <Button Name="btnReadFeed" Grid.Row="0" Content="Read" Width="110" Margin="10,0,10,0" HorizontalAlignment="Right" Click="btnReadFeed_Click" />  | 
 
19 | 
    <ScrollViewer Width="440" Height="530" Grid.Row="1" Margin="10, 20, 0, 0">  | 
 
20 | 
        <ListBox Name="listboxRSSFeedItems" Width="440" Height="530">  | 
 
22 | 
            <ListBox.ItemTemplate>  | 
 
26 | 
                            <RowDefinition Height="Auto" />  | 
 
28 | 
                            <RowDefinition Height="Auto" />  | 
 
29 | 
                        </Grid.RowDefinitions>  | 
 
30 | 
                        <TextBlock TextWrapping="Wrap" Text="{Binding Title}" Grid.Row="0" FontSize="24" HorizontalAlignment="Left" />  | 
 
32 | 
                        <HyperlinkButton Content="Link to details" NavigateUri="{Binding Link}" HorizontalAlignment="Left" Grid.Row="1"  Margin="0,0,0,30" />  | 
 
36 | 
            </ListBox.ItemTemplate>  | 
 
  
5. 为 RSS 条目创建一个单独的类
现在我们只需要创建一个新的容器类用来保存 RSS 数据
1 | 
public class RSSFeedItem  | 
 
3 | 
    public string Title { get; set; }  | 
 
4 | 
    public Uri URL { get; set; }  | 
 
  
 
6. 实现事件功能
接下来我们需要为 Read 按钮编写事件处理程序,我们需要创建一个新的 URI 对象并传递给 ReadRss 方法
1 | 
private void btnReadFeed_Click(object sender, RoutedEventArgs e)  | 
 
3 | 
    if (!string.IsNullOrEmpty(tbRSSFeedURL.Text))  | 
 
5 | 
        ReadRss(new Uri(tbRSSFeedURL.Text, UriKind.Absolute));  | 
 
  
 
7. 实现应用程序逻辑
需要确保在 MainPage.xaml 类中使用如下应用语句:
接下来你需要实现一个 ReadRss 方法,接收一个 URI 参数。如果请求成功的话,应用将处理返回的 RSS 信息并将每个条目放到 ListBox 中 
01 | 
public void ReadRss(Uri rssUri)  | 
 
03 | 
    WebClient wclient = new WebClient();  | 
 
05 | 
    wclient.OpenReadCompleted += (sender, e) =>  | 
 
10 | 
        Stream str = e.Result;  | 
 
11 | 
        XDocument xdoc = XDocument.Load(str);  | 
 
14 | 
        List<RSSFeedItem> rssFeedItems = (from item in xdoc.Descendants("item")  | 
 
15 | 
                                            select new RSSFeedItem()  | 
 
17 | 
                                                Title = item.Element("title").Value,  | 
 
18 | 
                                                URL = new Uri(item.Element("link").Value, UriKind.Absolute),  | 
 
24 | 
        listboxRSSFeedItems.Items.Clear();  | 
 
25 | 
        rssFeedItems.ForEach(item => listboxRSSFeedItems.Items.Add(item));  | 
 
27 | 
    wclient.OpenReadAsync(rssUri);  |