Windows Phone 7 网络编程之RSS阅读器

简介:

实现一个RSS阅读器,通过你输入的RSS地址来获取RSS的信息列表和查看RSS文章中的详细内容。RSS阅读器是使用了WebClient类来获取网络上的RSS的信息,然后再转化为自己定义好的RSS实体类对象的列表,最后绑定到页面上。

(1) RSS实体类和RSS服务类
RssItem.cs

 


 
 
  1. using System.Net;  
  2. using System.Text.RegularExpressions;  
  3.  
  4. namespace WindowsPhone.Helpers  
  5. {  
  6.     /// <summary> 
  7.     /// RSS对象类  
  8.     /// </summary> 
  9.     public class RssItem  
  10.     {  
  11.         /// <summary> 
  12.         /// 初始化一个RSS目录  
  13.         /// </summary> 
  14.         /// <param name="title">标题</param> 
  15.         /// <param name="summary">内容</param> 
  16.         /// <param name="publishedDate">发表事件</param> 
  17.         /// <param name="url">文章地址</param> 
  18.         public RssItem(string title, string summary, string publishedDate, string url)  
  19.         {  
  20.             Title = title;  
  21.             Summary = summary;  
  22.             PublishedDate = publishedDate;  
  23.             Url = url;  
  24.  
  25.             //解析html  
  26.             PlainSummary = HttpUtility.HtmlDecode(Regex.Replace(summary, "<[^>]+?>", ""));  
  27.         }  
  28.  
  29.         //标题  
  30.         public string Title { get; set; }  
  31.  
  32.         //内容  
  33.         public string Summary { get; set; }  
  34.  
  35.         //发表时间  
  36.         public string PublishedDate { get; set; }  
  37.  
  38.         //文章地址  
  39.         public string Url { get; set; }  
  40.  
  41.         //解析的文本内容  
  42.         public string PlainSummary { get; set; }  
  43.     }  

RssService.cs

 


 
 
  1. <phone:PhoneApplicationPage   
  2.     x:Class="ReadRssItemsSample.MainPage" 
  3.     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  4.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  5.     xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" 
  6.     xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" 
  7.     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  8.     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  9.     mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768" 
  10.     FontFamily="{StaticResource PhoneFontFamilyNormal}" 
  11.     FontSize="{StaticResource PhoneFontSizeNormal}" 
  12.     Foreground="{StaticResource PhoneForegroundBrush}" 
  13.     SupportedOrientations="Portrait" Orientation="Portrait" 
  14.     shell:SystemTray.IsVisible="True"> 
  15.  
  16.     <Grid x:Name="LayoutRoot" Background="Transparent"> 
  17.         <Grid.RowDefinitions> 
  18.             <RowDefinition Height="Auto"/> 
  19.             <RowDefinition Height="*"/> 
  20.         </Grid.RowDefinitions> 
  21.  
  22.         <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28"> 
  23.             <TextBlock x:Name="ApplicationTitle" Text="RSS阅读器" Style="{StaticResource PhoneTextNormalStyle}"/> 
  24.         </StackPanel> 
  25.  
  26.         <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> 
  27.             <Grid.RowDefinitions> 
  28.                 <RowDefinition Height="Auto" /> 
  29.                 <RowDefinition  Height="*"/> 
  30.             </Grid.RowDefinitions> 
  31.             <TextBlock FontSize="30" Grid.Row="1" Height="49" HorizontalAlignment="Left" Margin="0,6,0,0" Name="textBlock1" Text="RSS地址" VerticalAlignment="Top" Width="116" /> 
  32.             <TextBox Grid.Row="1" Height="72" HorizontalAlignment="Left" Margin="107,0,0,0" Name="rssURL" Text="http://www.cnblogs.com/rss" VerticalAlignment="Top" Width="349" /> 
  33.             <Button Content="加载 RSS" Click="Button_Click" Margin="-6,72,6,552" Grid.Row="1" /> 
  34.             <ListBox x:Name="listbox" Grid.Row="1" SelectionChanged="OnSelectionChanged" Margin="0,150,6,-11"> 
  35.                 <ListBox.ItemTemplate  > 
  36.                     <DataTemplate> 
  37.                         <Grid> 
  38.                             <Grid.RowDefinitions> 
  39.                                 <RowDefinition Height="Auto" /> 
  40.                                 <RowDefinition Height="Auto" /> 
  41.                                 <RowDefinition Height="60" /> 
  42.                             </Grid.RowDefinitions> 
  43.                             <TextBlock Grid.Row="0" Text="{Binding Title}" Foreground="Blue" /> 
  44.                             <TextBlock Grid.Row="1" Text="{Binding PublishedDate}" Foreground="Green" /> 
  45.                             <TextBlock Grid.Row="2" TextWrapping="Wrap" Text="{Binding PlainSummary}" /> 
  46.                         </Grid> 
  47.                     </DataTemplate> 
  48.                 </ListBox.ItemTemplate> 
  49.             </ListBox> 
  50.         </Grid> 
  51.     </Grid> 
  52.    
  53. </phone:PhoneApplicationPage> 

(2) RSS页面展示

MainPage.xaml

 


 
 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.IO;  
  4. using System.Net;  
  5. using System.ServiceModel.Syndication;  
  6. using System.Xml;  
  7.  
  8. namespace WindowsPhone.Helpers  
  9. {  
  10.     /// <summary> 
  11.     /// 获取网络RSS服务类  
  12.     /// </summary> 
  13.     public static class RssService  
  14.     {  
  15.           
  16.         /// <summary> 
  17.         /// 获取RSS目录列表  
  18.         /// </summary> 
  19.         /// <param name="rssFeed">RSS的网络地址</param> 
  20.         /// <param name="onGetRssItemsCompleted">获取完成事件</param> 
  21.         public static void GetRssItems(string rssFeed, Action<IEnumerable<RssItem>> onGetRssItemsCompleted = null, Action<Exception> onError = null, Action onFinally = null)  
  22.         {  
  23.             WebClient webClient = new WebClient();  
  24.  
  25.             //注册webClient读取完成事件  
  26.             webClient.OpenReadCompleted += delegate(object sender, OpenReadCompletedEventArgs e)  
  27.             {  
  28.                 try  
  29.                 {  
  30.  
  31.                     if (e.Error != null)  
  32.                     {  
  33.                         if (onError != null)  
  34.                         {  
  35.                             onError(e.Error);  
  36.                         }  
  37.                         return;  
  38.                     }  
  39.  
  40.                     //将网络获取的信息转化成RSS实体类  
  41.                     List<RssItem> rssItems = new List<RssItem>();  
  42.                     Stream stream = e.Result;  
  43.                     XmlReader response = XmlReader.Create(stream);  
  44.                     SyndicationFeed feeds = SyndicationFeed.Load(response);  
  45.                     foreach (SyndicationItem f in feeds.Items)  
  46.                     {  
  47.                         RssItem rssItem = new RssItem(f.Title.Text, f.Summary.Text, f.PublishDate.ToString(), f.Links[0].Uri.AbsoluteUri);  
  48.                         rssItems.Add(rssItem);  
  49.                     }  
  50.  
  51.                     //通知完成返回事件执行  
  52.                     if (onGetRssItemsCompleted != null)  
  53.                     {  
  54.                         onGetRssItemsCompleted(rssItems);  
  55.                     }  
  56.                 }  
  57.                 finally  
  58.                 {  
  59.                     if (onFinally != null)  
  60.                     {  
  61.                         onFinally();  
  62.                     }  
  63.                 }  
  64.             };  
  65.  
  66.             webClient.OpenReadAsync(new Uri(rssFeed));  
  67.         }  
  68.     }  

MainPage.xaml.cs

 


 
 
  1. using System.Windows;  
  2. using System.Windows.Controls;  
  3. using Microsoft.Phone.Controls;  
  4. using WindowsPhone.Helpers;  
  5.  
  6. namespace ReadRssItemsSample  
  7. {  
  8.     public partial class MainPage : PhoneApplicationPage  
  9.     {  
  10.         private  string WindowsPhoneBlogPosts = "";  
  11.  
  12.         public MainPage()  
  13.         {  
  14.             InitializeComponent();  
  15.         }  
  16.  
  17.         private void Button_Click(object sender, RoutedEventArgs e)  
  18.         {  
  19.             if (rssURL.Text != "")  
  20.             {  
  21.                 WindowsPhoneBlogPosts = rssURL.Text;  
  22.             }  
  23.             else  
  24.             {  
  25.                 MessageBox.Show("请输入RSS地址!");  
  26.                 return;  
  27.             }  
  28.             //加载RSS列表  
  29.             RssService.GetRssItems(  
  30.                 WindowsPhoneBlogPosts,  
  31.                 (items) => { listbox.ItemsSource = items; },  
  32.                 (exception) => { MessageBox.Show(exception.Message); },  
  33.                 null  
  34.                 );  
  35.         }  
  36.  
  37.         //查看文章的详细内容  
  38.         private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)  
  39.         {  
  40.             if (listbox.SelectedItem == null)  
  41.                 return;  
  42.  
  43.             var template = (RssItem)listbox.SelectedItem;  
  44.  
  45.             MessageBox.Show(template.PlainSummary);  
  46.  
  47.             listbox.SelectedItem = null;  
  48.         }  
  49.  
  50.     }  

(3)程序运行的效果如下

 

 

 

 


本文转自linzheng 51CTO博客,原文链接:http://blog.51cto.com/linzheng/1078563

相关文章
|
1月前
|
安全 Windows
【Azure Cloud Service】在Windows系统中抓取网络包 ( 不需要另外安全抓包工具)
通常,在生产环境中,为了保证系统环境的安全和纯粹,是不建议安装其它软件或排查工具(如果可以安装,也是需要走审批流程)。 本文将介绍一种,不用安装Wireshark / tcpdump 等工具,使用Windows系统自带的 netsh trace 命令来获取网络包的步骤
71 32
|
7月前
|
iOS开发 MacOS Windows
|
2月前
|
缓存 监控 网络协议
计算机网络的常用的网络通信命令(Windows)
本文介绍了网络技术中常用的命令,如ping用于检测网络连通性,ipconfig查看TCP/IP配置,netstat监控网络状态,arp显示和修改ARP缓存,at安排任务执行,tracert追踪路由,以及nbtstat获取NetBIOS信息。
45 1
|
3月前
|
安全 Windows
怎样利用 Windows XP实现网络统一关机
怎样利用 Windows XP实现网络统一关机
怎样利用 Windows XP实现网络统一关机
|
4月前
|
Web App开发 SQL 存储
警惕可能对Windows网络带来风险的工具
警惕可能对Windows网络带来风险的工具
警惕可能对Windows网络带来风险的工具
|
4月前
|
网络协议 Linux 网络安全
【Azure 应用服务】更便捷的方式抓取Azure App Service for Windows的网络包
【Azure 应用服务】更便捷的方式抓取Azure App Service for Windows的网络包
|
4月前
|
Windows
【Azure 环境】在Windows环境中抓取网络包(netsh trace)后,如何转换为Wireshark格式以便进行分析
【Azure 环境】在Windows环境中抓取网络包(netsh trace)后,如何转换为Wireshark格式以便进行分析
|
4月前
|
Java 数据安全/隐私保护 Windows
Windows Service 服务中,不能访问挂载目录(网络映射盘)
Windows Service 服务中,不能访问挂载目录(网络映射盘)
139 0
|
4月前
|
Windows
Windows 映射网络驱动器及删除-此网格连接不存在
Windows 映射网络驱动器及删除-此网格连接不存在
466 0
|
6月前
|
Windows
解决Windows 11/10 上的网络打印机错误 0x0000011b
解决Windows 11/10 上的网络打印机错误 0x0000011b
884 5