65.9K
CodeProject 正在变化。 阅读更多。
Home

一个简单的 Silverlight RSS 阅读器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.74/5 (20投票s)

2010 年 5 月 26 日

CPOL

3分钟阅读

viewsIcon

65553

downloadIcon

1400

这是一个简单的Silverlight RSS阅读器,它从提要URL中提取数据。

Capture.png

引言

本文展示了如何在Silverlight中创建一个简单的RSS阅读器。这是一篇初学者文章,展示了Silverlight中的基本模板、绑定和此类基本概念。

背景

源代码包括一个Silverlight项目、一个Web项目和一个托管在Web应用程序中的WCF服务。我在Visual Studio 2008中开发了这个示例。

使用代码 

我们可以从Visual Studio模板开始创建Silverlight应用程序,它将自动创建一个Silverlight项目和一个Web应用程序,Silverlight托管于其中。我们需要从用户输入的提要URL中获取数据,为此,我们将使用WCF服务,以便Silverlight客户端可以进行异步调用并获取响应。因此,让我们首先向Web应用程序添加一个WCF服务,在本例中是RSSReaderService.svc。如果我们将WCF服务直接添加到Web应用程序而不是创建一个新的服务项目,那么当我们启动应用程序时,该服务将托管在Web应用程序本身中。我创建了一个ServiceContract IRSSReaderService并添加了一个OperationContract GetFeed(string uri),这是一个为服务契约定义操作的方法。

namespace RSSReader.Web
{
    [ServiceContract]
    public interface IRSSReaderService
    {
        [OperationContract]
        IEnumerable<RSSItem> GetFeed(string uri);
    }
} 

我们需要在实现IRSSReaderService的服务代码中实现操作契约GetFeed(string uri)。我们使用System.ServiceModel.Syndication,一个用于联合对象模型的命名空间,用于从使用指定的提要URL实例化的XmlReader加载联合提要。为了将提要中的属性发送给客户端,我们创建了一个DataContract RSSItem,其中包含DataMember,如Title、Summary、PublishDate和Permalink。我们可以根据我们的需求自定义数据成员,但在这里我只是使用这么多信息发送给客户端。

[DataContract]
public class RSSItem    
{
   [DataMember]        
   public string Title { get; set; }

创建此DataContract后,我们使用指定的URL创建XmlReader,并从这个XMLReader加载SyndicationFeed项。现在我们可以使用LINQ来遍历这些联合项目,并从中获取所需的信息。我们正在填充我们创建的RSSItem,并将此对象的IEnumerable从服务发送到客户端。因此,我们的GetFeed(string url)方法实现如下

[AspNetCompatibilityRequirements(RequirementsMode = 
		AspNetCompatibilityRequirementsMode.Allowed)]
public class RSSReaderService : IRSSReaderService
{
   public IEnumerable<RSSItem> GetFeed(string uri)
   {
       XmlReader reader = XmlReader.Create(uri);
       SyndicationFeed rssFeed = SyndicationFeed.Load(reader);

       var items = from p in rssFeed.Items
                     select new RSSItem
                     {
                       Title = p.Title.Text,
                       Summary = p.Summary.Text.Trim(),
                       Permalink = (p.Links.FirstOrDefault() != null) ? 
				p.Links.FirstOrDefault().GetAbsoluteUri() : null,
                       PublishDate = p.PublishDate.LocalDateTime.ToString("dd/MMM/yyyy")
                      };
       return items;
   }
}

因此,我们的服务已完成,并准备好供客户端使用。现在我们需要创建Silverlight客户端。将服务引用添加到Silverlight项目,然后在Silverlight项目中创建一个用户控件 ,在示例中你可以看到用户控件UC_RSSReader.xaml。我在此用户控件中添加了一些控件,例如ListBox,对其进行了模板化,并为这些控件添加了绑定。我们编辑了ListBox的ItemTemplate,并添加了自定义数据模板,该模板由TextBlockListBox组成,以根据需要显示提要数据。我们可以根据我们的需求或要显示的数据量对其进行自定义。现在我们有了绑定到相应属性的usercontrol ListBox 正在显示来自URL的提要数据,XAML如下:

 <ListBox x:Name="RSSFeed"
                 VerticalAlignment="Stretch"
                 HorizontalAlignment="Stretch"
                 Grid.Row="2"
                 Grid.ColumnSpan="2">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid MinWidth="{Binding ElementName=LayoutRoot, Path=ActualWidth}"
                          MaxWidth="{Binding ElementName=LayoutRoot, Path=ActualWidth}">
                        <Grid.RowDefinitions>
                            <RowDefinition />
                            <RowDefinition />
                            <RowDefinition />
                        </Grid.RowDefinitions>
                        <TextBlock Text="{Binding Title}"
                                   FontFamily="Verdana"
                                   FontSize="13" />
                        <TextBlock Grid.Row="2"
                                   Text="{Binding PublishDate}"
                                   HorizontalAlignment="Left"
                                   FontFamily="Verdana"
                                   FontSize="11" />
                        <HyperlinkButton Grid.Row="2"
                                         Content="Read Article>>"
                                         NavigateUri="{Binding Permalink}"
                                         HorizontalAlignment="Center"
                                         FontFamily="Verdana"
                                         FontSize="11"
                                         FontStyle="Italic"
                                         ToolTipService.ToolTip="{Binding Title}"
                                         TargetName="__blank" />
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

由于这是一个非常基本的示例,我们没有为此应用程序使用MVVM模式。我们可以按照事件订阅等正常方式,即直接了当,并且我们将所有逻辑都放在代码背后。单击获取Button时,我们将请求发送到具有提要URL的服务,从服务中获取数据,并将该结果与ListBox绑定。ListBox 将显示标题、发布日期以及指向原始提要项目的永久链接。

private void FetchRSS_Click(object sender, RoutedEventArgs e)
{
      if (!string.IsNullOrEmpty(RSSFeedUrlTextBox.Text.Trim()) 
                && Uri.IsWellFormedUriString(RSSFeedUrlTextBox.Text.Trim(), 
						UriKind.Absolute))
      {
          LoadingTextBlock.Visibility = Visibility.Visible;
          RSSFeed.Items.Clear();
          RSSReaderServiceClient RSSReaderServiceClient = new RSSReaderServiceClient();
          RSSReaderServiceClient.GetFeedCompleted += 
		new EventHandler<GetFeedCompletedEventArgs>
		(RSSReaderServiceClient_GetFeedCompleted);
          RSSReaderServiceClient.GetFeedAsync
		((new Uri(RSSFeedUrlTextBox.Text)).ToString());                
       }
} 

void RSSReaderServiceClient_GetFeedCompleted
		(object sender, GetFeedCompletedEventArgs e)
{
      RSSFeed.ItemsSource = e.Result;

将此usercontrol 添加到主页并进行编译。在运行应用程序之前,不要忘记将跨域策略文件放在Web应用程序的根目录中。否则,Silverlight客户端将无法与WCF服务通信。如果应用程序示例出现任何运行时错误,请删除并在Silverlight项目中重新添加服务引用。

历史

  • 发布于 2010年5月26日
© . All rights reserved.