实现一个RSS阅读器,通过你输入的RSS地址来获取RSS的信息列表和查看RSS文章中的详细内容。RSS阅读器是使用了WebClient类来获取网络上的RSS的信息,然后再转化为自己定义好的RSS实体类对象的列表,最后绑定到页面上。
(1) RSS实体类和RSS服务类
RssItem.cs
- using System.Net;
- using System.Text.RegularExpressions;
- namespace WindowsPhone.Helpers
- {
- /// <summary>
- /// RSS对象类
- /// </summary>
- public class RssItem
- {
- /// <summary>
- /// 初始化一个RSS目录
- /// </summary>
- /// <param name="title">标题</param>
- /// <param name="summary">内容</param>
- /// <param name="publishedDate">发表事件</param>
- /// <param name="url">文章地址</param>
- public RssItem(string title, string summary, string publishedDate, string url)
- {
- Title = title;
- Summary = summary;
- PublishedDate = publishedDate;
- Url = url;
- //解析html
- PlainSummary = HttpUtility.HtmlDecode(Regex.Replace(summary, "<[^>]+?>", ""));
- }
- //标题
- public string Title { get; set; }
- //内容
- public string Summary { get; set; }
- //发表时间
- public string PublishedDate { get; set; }
- //文章地址
- public string Url { get; set; }
- //解析的文本内容
- public string PlainSummary { get; set; }
- }
- }
RssService.cs
- <phone:PhoneApplicationPage
- x:Class="ReadRssItemsSample.MainPage"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
- xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
- FontFamily="{StaticResource PhoneFontFamilyNormal}"
- FontSize="{StaticResource PhoneFontSizeNormal}"
- Foreground="{StaticResource PhoneForegroundBrush}"
- SupportedOrientations="Portrait" Orientation="Portrait"
- shell:SystemTray.IsVisible="True">
- <Grid x:Name="LayoutRoot" Background="Transparent">
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="*"/>
- </Grid.RowDefinitions>
- <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
- <TextBlock x:Name="ApplicationTitle" Text="RSS阅读器" Style="{StaticResource PhoneTextNormalStyle}"/>
- </StackPanel>
- <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto" />
- <RowDefinition Height="*"/>
- </Grid.RowDefinitions>
- <TextBlock FontSize="30" Grid.Row="1" Height="49" HorizontalAlignment="Left" Margin="0,6,0,0" Name="textBlock1" Text="RSS地址" VerticalAlignment="Top" Width="116" />
- <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" />
- <Button Content="加载 RSS" Click="Button_Click" Margin="-6,72,6,552" Grid.Row="1" />
- <ListBox x:Name="listbox" Grid.Row="1" SelectionChanged="OnSelectionChanged" Margin="0,150,6,-11">
- <ListBox.ItemTemplate >
- <DataTemplate>
- <Grid>
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto" />
- <RowDefinition Height="Auto" />
- <RowDefinition Height="60" />
- </Grid.RowDefinitions>
- <TextBlock Grid.Row="0" Text="{Binding Title}" Foreground="Blue" />
- <TextBlock Grid.Row="1" Text="{Binding PublishedDate}" Foreground="Green" />
- <TextBlock Grid.Row="2" TextWrapping="Wrap" Text="{Binding PlainSummary}" />
- </Grid>
- </DataTemplate>
- </ListBox.ItemTemplate>
- </ListBox>
- </Grid>
- </Grid>
- </phone:PhoneApplicationPage>
(2) RSS页面展示
MainPage.xaml
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Net;
- using System.ServiceModel.Syndication;
- using System.Xml;
- namespace WindowsPhone.Helpers
- {
- /// <summary>
- /// 获取网络RSS服务类
- /// </summary>
- public static class RssService
- {
- /// <summary>
- /// 获取RSS目录列表
- /// </summary>
- /// <param name="rssFeed">RSS的网络地址</param>
- /// <param name="onGetRssItemsCompleted">获取完成事件</param>
- public static void GetRssItems(string rssFeed, Action<IEnumerable<RssItem>> onGetRssItemsCompleted = null, Action<Exception> onError = null, Action onFinally = null)
- {
- WebClient webClient = new WebClient();
- //注册webClient读取完成事件
- webClient.OpenReadCompleted += delegate(object sender, OpenReadCompletedEventArgs e)
- {
- try
- {
- if (e.Error != null)
- {
- if (onError != null)
- {
- onError(e.Error);
- }
- return;
- }
- //将网络获取的信息转化成RSS实体类
- List<RssItem> rssItems = new List<RssItem>();
- Stream stream = e.Result;
- XmlReader response = XmlReader.Create(stream);
- SyndicationFeed feeds = SyndicationFeed.Load(response);
- foreach (SyndicationItem f in feeds.Items)
- {
- RssItem rssItem = new RssItem(f.Title.Text, f.Summary.Text, f.PublishDate.ToString(), f.Links[0].Uri.AbsoluteUri);
- rssItems.Add(rssItem);
- }
- //通知完成返回事件执行
- if (onGetRssItemsCompleted != null)
- {
- onGetRssItemsCompleted(rssItems);
- }
- }
- finally
- {
- if (onFinally != null)
- {
- onFinally();
- }
- }
- };
- webClient.OpenReadAsync(new Uri(rssFeed));
- }
- }
- }
MainPage.xaml.cs
- using System.Windows;
- using System.Windows.Controls;
- using Microsoft.Phone.Controls;
- using WindowsPhone.Helpers;
- namespace ReadRssItemsSample
- {
- public partial class MainPage : PhoneApplicationPage
- {
- private string WindowsPhoneBlogPosts = "";
- public MainPage()
- {
- InitializeComponent();
- }
- private void Button_Click(object sender, RoutedEventArgs e)
- {
- if (rssURL.Text != "")
- {
- WindowsPhoneBlogPosts = rssURL.Text;
- }
- else
- {
- MessageBox.Show("请输入RSS地址!");
- return;
- }
- //加载RSS列表
- RssService.GetRssItems(
- WindowsPhoneBlogPosts,
- (items) => { listbox.ItemsSource = items; },
- (exception) => { MessageBox.Show(exception.Message); },
- null
- );
- }
- //查看文章的详细内容
- private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
- {
- if (listbox.SelectedItem == null)
- return;
- var template = (RssItem)listbox.SelectedItem;
- MessageBox.Show(template.PlainSummary);
- listbox.SelectedItem = null;
- }
- }
- }
(3)程序运行的效果如下
本文转自linzheng 51CTO博客,原文链接:http://blog.51cto.com/linzheng/1078563