回复:Silverlight 2 (beta1)数据操作(7)
第三部分:调用FlickR服务来查找图片现在我们进入程序的主要部分了,我们根据查询条件通过调用
FlickRs REST API来获取图片结果集。并且当用户在图片上单击,可以自动跳至下一张图片。
首先,调用
FlickRs REST API,你需要申请一个Key,从
FlickRs REST API可以获取。
接下来,定义一个LoadPhotos()方法在Silverlight客户端调用REST API。

Code
void LoadPhotos(string topic)
{
string apiKey = "<<get your own >>";
string secret = "<<get your own >>";
string url = String.Format("http://api.flickr.com/services
/rest/?method=flickr.photos.search&api_key={1}&text={0}",
topic, apiKey, secret);
WebClient flickRService = new WebClient();
flickRService.DownloadStringCompleted +=
new DownloadStringCompletedEventHandler
(flickRService_DownloadStringCompleted);
flickRService.DownloadStringAsync(new Uri(url));
searchTermTextBox.Text = "Calling FlickR...";
}
调用REST API完成之后,我们需要分析XML格式,你可以参考
http://flickr.com/services/api/explore/这个页面,其格式基本上像下面样子:

Code
<?xml version="1.0" encoding="utf-8" ?>
<rsp stat="ok">
<photos page="1" pages="32769" perpage="100" total="3276843">
<photo id="2436622217" owner="22956152@N04" secret="6c8293bb5c"
server="2070" farm="3" title="IMG_3492_resize" ispublic="1"
isfriend="0" isfamily="0" />
<photo id="2437437876" owner="41848473@N00" secret="97a7e1a066"
server="2303" farm="3" title="Eric & Dog" ispublic="1"
isfriend="0" isfamily="0" />
</photos>
</rsp>
所以,我们需要用到XML,Silverlight 2对LinqToXml很好的支持,我们很容易利用LinqToXml来获取节点,使用LinqToXml之前,你需要在Silverlight工程中添加System.Xml.linq.dll程序集。

附件:
您所在的用户组无法下载或查看附件现在,让我们实现flickRService_DownloadStringCompleted方法。首先判断是否在调用过程中发生了错误,确定一下是否正确的调用了FlickR服务。

Code
XDocument xmlPhotos = XDocument.Parse(e.Result);
if (e.Error != null ||
xmlPhotos.Element("rsp").Attribute("stat").Value == "fail"){
string results = e.Result;
searchTermTextBox.Text= "Error! (" + results + ")";
return;
}
else {
searchTermTextBox.Text = "It worked!";
}
现在在单击事件中使用LoadPhotos方法。

Code
private void button_Click(object sender, RoutedEventArgs e)
{
LoadPhotos(searchTermTextBox.Text);
}
运行程序,如果你看到如下图所示的话,key验证失败,请检验你的API key

附件:
您所在的用户组无法下载或查看附件当你看到的是这样,你上面做的全部都正确了,可以接着往下做!

附件:
您所在的用户组无法下载或查看附件我们分析一下XML结果集,需要截取图片的URL地址,我们使用LINQ,首先呢,定义一个FlickRPhoto类来封装一下XML节点的映射。

Code
public class FlickRPhoto
{
public string Id { get; set; }
public string Owner { get; set; }
public string Secret { get; set; }
public string Server { get; set; }
public string Farm { get; set; }
public string Title { get; set; }
}
还要添加一个属性值在遵循FlickR URL协议下格式化输出图片URL。

Code
public string ImageUrl
{
get
{
return string.Format("http://farm{0}.static.flickr.com
/{1}/{2}_{3}.jpg", Farm,Server,Id,Secret);
}
}
现在,我们需要使用LINQ编码实现类成员与XML节点的映射。

Code
Photos = from photo in xmlPhotos.Element("rsp").Element("photos")
.Descendants().ToList()
select new FlickRPhoto
{
Id = (string)photo.Attribute("id"),
Owner = (string)photo.Attribute("owner"),
Secret = (string)photo.Attribute("secret"),
Server = (string)photo.Attribute("server"),
Farm = (string)photo.Attribute("farm"),
Title = (string)photo.Attribute("title"),
};在这个类中定义一个Photos字段,将来会用到。
IEnumerable<FlickRPhoto> Photos;
接下来显示图片,获取返回的结果集第一个记录并且显示。

Code
FlickRPhoto p = Photos.First();
this.searchResultsImage.SetValue(Image.SourceProperty, p.ImageUrl);
searchTermTextBox.Text = p.Title;
现在非常酷了,但是我想要显示别的图片,当单击图片的时候显示另一张图片。这样做的话先定义一个事件驱动。

Code
<Image MouseLeftButtonDown="searchResultsImage_MouseLeftButtonDown"
x:Name="searchResultsImage"
接下来实现这个事件,先预先检验图片是否为空,在使用当前ImageNumber字段数值获取下一张图片。

Code
private void searchResultsImage_MouseLeftButtonDown
(object sender, MouseButtonEventArgs e)
{
if (Photos == null) return;
if (ImageNumber >= Photos.Count()) ImageNumber = 0;
FlickRPhoto p = Photos.Skip(ImageNumber).First();
this.searchResultsImage.SetValue(Image.SourceProperty, p.ImageUrl);
ImageNumber++;
}
现在你在图片上点击,它循环的显示图片了。

附件:
您所在的用户组无法下载或查看附件