根据不同网站的RSS源获取数据(http请求),解析数据(XML),显示数据(绑定到集合),从而达到新闻阅读的效果。
由于是WP初学者,MSDN参考信息有限,很多功能未能实现,比如RSS地址的解析,应该解析成.xml后缀的,但这里是直接输入的。
在界面显示上,用到了Grid布局和DataTemplate模版套用
运行效果:
主要程序代码:
private void btnShowNews_Click(object sender, RoutedEventArgs e)
{
//添加源
UriBuilder uri = new UriBuilder(rssURL.Text);
//初始化 请求
HttpWebRequest feedRequest = WebRequest.Create(uri.Uri) as HttpWebRequest;
if (feedRequest != null)
{
//设置异步请求状态对象
FeedUpdateState feedState = new FeedUpdateState();
feedState.AsyncRequest = feedRequest;
//异步请求
feedRequest.BeginGetResponse(new AsyncCallback(HandleFeedResponse), feedState);
}
}
private void HandleFeedResponse(IAsyncResult asyncResult)
{
if (asyncResult.AsyncState != null)
{
//获得异步请求的状态信息
FeedUpdateState feedState = asyncResult.AsyncState as FeedUpdateState;
HttpWebRequest feedRequest=feedState.AsyncRequest as HttpWebRequest;
//结束异步请求
try
{
feedState.AsyncResponse = feedRequest.EndGetResponse(asyncResult) as HttpWebResponse;
}
catch (Exception)
{
//由于HttpWebRequest异步调用完成时不能保证回调函数运行在 UI 线程,而更新TextBlock里的文本需在UI线程处理。Dispatcher类的BeginInvoke方法就是用来实现对 UI 线程的调用。
Deployment.Current.Dispatcher.BeginInvoke(new Action(() =>
{
MessageBox.Show("网路错误", "提示", MessageBoxButton.OK);
}));
return;
}
Stream streamResult;
try
{
//从状态对象中获取返回的数据流
streamResult = feedState.AsyncResponse.GetResponseStream();
if (streamResult != null)
{
//加载 xml中需要的元素
XElement xmlFeed = XElement.Load(streamResult);
Deployment.Current.Dispatcher.BeginInvoke(new Action(() =>
{
foreach (XElement curElement in xmlFeed.Descendants("item"))
{
NewsDetail tempNews = new NewsDetail();
tempNews.Title += (String)(curElement.Element("title")) + "\n";
tempNews.Time += (String)(curElement.Element("pubDate")) + "\n";
tempNews.Detail += (String)(curElement.Element("description")) + "\n";
tempNews.Link += (String)(curElement.Element("link")) + "\n";
AllNews.Add(tempNews);
}
}));
}
else
{
Deployment.Current.Dispatcher.BeginInvoke(new Action(() =>
{
MessageBox.Show("获取数据为空", "提示", MessageBoxButton.OK);
}));
}
}
catch (Exception)
{
Deployment.Current.Dispatcher.BeginInvoke(new Action(() =>
{
MessageBox.Show("获取数据失败", "提示", MessageBoxButton.OK);
}));
return;
}
}
感慨:
最近 也一直在看杨中科老师的用wpf做的人事管理系统直播视频,才发现window phone的界面设计也是这么的似曾相识,想起了那句经典的微博
此项目参考"传智播客.net培训Windows 8开发视频教程"
源代码下载地址
http://pan.baidu.com/share/link?shareid=173804&uk=1360555118