WINDOWSPHONE STUDY1:创建一个 Windows Phone 7 下的简单 RSS 阅读器 dodo

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

下载整个项目打包

项目是详细的步骤:

1. 创建新项目

首先我们要创建一个新项目,打开 Visual Studio 2010 -> File -> New Project -> 选择 Windows Phone Application ,如下图所示:

eugenedotnet creating windows phone 7 project

2. 为项目增加引用

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

eugenedotnet add Microsoft.Xml.Linq reference

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 </StackPanel>

4. 修改 ContentGrid

ContentGrid 将包含应用程序中所需的 UI 元素,最基本的包括下面三项:

  • TextBox 用于输入 RSS 网址
  • Button 用于触发读取 RSS 信息的事件
  • ListBox 用于显示 RSS 数据结果,包含标题和链接

需要注意的是按钮的点击事件是通过 XAML 中定义的,另外 Windows Phone 7 有一个新的 InputScope 特性用于简化输入框直接输入 URL 地址后响应回车键。

01 <Grid x:Name="ContentGrid" Grid.Row="1">
02   
03     <Grid.RowDefinitions>
04         <RowDefinition Height="70" />
05         <RowDefinition Height="Auto" />
06     </Grid.RowDefinitions>
07   
08     <TextBox Name="tbRSSFeedURL" Grid.Row="0" Text=""  Width="350" Margin="10,0,10,0" HorizontalAlignment="Left">
09   
10         <TextBox.InputScope>
11             <InputScope>
12                 <InputScopeName NameValue="Url" />
13             </InputScope>
14         </TextBox.InputScope>
15   
16     </TextBox>
17     <Button Name="btnReadFeed" Grid.Row="0" Content="Read" Width="110" Margin="10,0,10,0" HorizontalAlignment="Right" Click="btnReadFeed_Click" />
18   
19     <ScrollViewer Width="440" Height="530" Grid.Row="1" Margin="10, 20, 0, 0">
20         <ListBox Name="listboxRSSFeedItems" Width="440" Height="530">
21   
22             <ListBox.ItemTemplate>
23                 <DataTemplate>
24                     <Grid>
25                         <Grid.RowDefinitions>
26                             <RowDefinition Height="Auto" />
27   
28                             <RowDefinition Height="Auto" />
29                         </Grid.RowDefinitions>
30                         <TextBlock TextWrapping="Wrap" Text="{Binding Title}" Grid.Row="0" FontSize="24" HorizontalAlignment="Left" />
31   
32                         <HyperlinkButton Content="Link to details" NavigateUri="{Binding Link}" HorizontalAlignment="Left" Grid.Row="1"  Margin="0,0,0,30" />
33   
34                     </Grid>
35                 </DataTemplate>
36             </ListBox.ItemTemplate>
37         </ListBox>
38     </ScrollViewer>
39 </Grid>

5. 为 RSS 条目创建一个单独的类

现在我们只需要创建一个新的容器类用来保存 RSS 数据

1 public class RSSFeedItem
2 {
3     public string Title { get; set; }
4     public Uri URL { get; set; }
5 }

6. 实现事件功能

接下来我们需要为 Read 按钮编写事件处理程序,我们需要创建一个新的 URI 对象并传递给 ReadRss 方法

1 private void btnReadFeed_Click(object sender, RoutedEventArgs e)
2 {
3     if (!string.IsNullOrEmpty(tbRSSFeedURL.Text))
4     {
5         ReadRss(new Uri(tbRSSFeedURL.Text, UriKind.Absolute));
6     }
7 }

7. 实现应用程序逻辑

需要确保在 MainPage.xaml 类中使用如下应用语句:

1 using System.Xml.Linq; // for reading RSS using Linq-To-XML
2 using System.IO; // for Stream object

接下来你需要实现一个 ReadRss 方法,接收一个 URI 参数。如果请求成功的话,应用将处理返回的 RSS 信息并将每个条目放到 ListBox 中

01 public void ReadRss(Uri rssUri)
02 {
03     WebClient wclient = new WebClient();
04    
05     wclient.OpenReadCompleted += (sender, e) =>
06     {
07         if (e.Error != null)
08             return;
09    
10         Stream str = e.Result;
11         XDocument xdoc = XDocument.Load(str);
12    
13         // take 10 first results
14         List<RSSFeedItem> rssFeedItems = (from item in xdoc.Descendants("item")
15                                             select new RSSFeedItem()
16                                             {
17                                                 Title = item.Element("title").Value,
18                                                 URL = new Uri(item.Element("link").Value, UriKind.Absolute),
19                                             }).Take(10).ToList();
20         // close
21         str.Close();
22    
23         // add results to listbox
24         listboxRSSFeedItems.Items.Clear();
25         rssFeedItems.ForEach(item => listboxRSSFeedItems.Items.Add(item));
26     };
27     wclient.OpenReadAsync(rssUri);
28 }
原文地址:https://www.cnblogs.com/zgqys1980/p/2754479.html