天天看点

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

实现一个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="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.ServiceModel.Syndication;  

using System.Xml;  

    /// 获取网络RSS服务类  

    public static class RssService  

        /// 获取RSS目录列表  

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

            var template = (RssItem)listbox.SelectedItem;  

            MessageBox.Show(template.PlainSummary);  

            listbox.SelectedItem = null;  

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

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