一个简单的 Silverlight RSS 阅读器






4.74/5 (20投票s)
这是一个简单的Silverlight RSS阅读器,它从提要URL中提取数据。

引言
本文展示了如何在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)
。我们使用
,一个用于联合对象模型的命名空间,用于从使用指定的提要URL实例化的System.ServiceModel.Syndication
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,并添加了自定义数据模板,该模板由TextBlock
和ListBox
组成,以根据需要显示提要数据。我们可以根据我们的需求或要显示的数据量对其进行自定义。现在我们有了绑定到相应属性的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日