自从wp8面世,一直都想做wp8开发,苦于各种原因(主要是.net基础不好),一直没有学成。六月底换了新工作, 有幸进入一家wp应用的公司,也开始我正式学习wp开发之路。
拽点废话,类似于小说的背景,各位看官请勿吐槽。
首先,本人使用使用诺基亚将近一年了,每天有个习惯,就是稍微闲着点,就经常逛逛博客园,可以说我的零碎时间,让博客园占去了一大半。但应用商店里下载的各种博客园总觉得不是太好,也说不上来哪里不好。现在机会来了,在学习的过程中,一步步打造自己的专属博客园。
原理很简单,就是通过http请求,抓取博客园的页面,文章列表用ListBox显示,点击后,将地址传到另一个页面,进行详细内容的抓取,显示在WebBrowser中。中间用到了地址),这个比HtmlAgilityPack牛逼多了,瞬间把HtmlAgilityPack抛弃了。苦逼的是,但我开始动手做的时候,发现Jumony竟然不能在wp8中使用,我又瞬间石化了,然后又把HtmlAgilityPack捡了起来。
下面上帮助类代码,及时Post请求,和Get请求,暂时只用到了Get请求, post请求是准备做用户中心的时候使用的。
public class HttpHelper
{
public static CookieContainer cc = new CookieContainer();
/// <summary>
/// 发起异步post的请求,可用于模拟登陆。
/// </summary>
/// <param name="url">post的地址</param>
/// <param name="poststr">参数字符串</param>
/// <param name="action">回调函数</param>
public static void HttpPostAsync(string url, string poststr, Action<string> action)
{
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
req.Method = "POST";
req.CookieContainer = cc;
req.Accept = "application/json, text/javascript, */*; q=0.01";
req.ContentType = "application/x-www-form-urlencoded";
req.AllowAutoRedirect = false;
req.BeginGetRequestStream(new AsyncCallback(asy =>
{
HttpWebRequest req1 = (HttpWebRequest)asy.AsyncState;
using (Stream stream1 = req1.EndGetRequestStream(asy))
{
byte[] postData = Encoding.UTF8.GetBytes(poststr);
stream1.Write(postData, 0, postData.Length);
}
//开始异步接收数据
req1.BeginGetResponse(new AsyncCallback(res =>
{
HttpWebRequest req2 = (HttpWebRequest)res.AsyncState;
//结束返回的请求数据
HttpWebResponse response = (HttpWebResponse)req2.EndGetResponse(res);
using (Stream stream2 = response.GetResponseStream())
{
StreamReader reader = new StreamReader(stream2);
string resStr = reader.ReadToEnd();
action(resStr);
}
}), req1);
}), req);
}
public static void HttpGetAsync(string url,Action<string> action)
{
if (Utils.GetNetStates()=="None")
{
action("no network");//无网络
return;
}
HttpWebRequest req1 = (HttpWebRequest)HttpWebRequest.Create(url);
req1.CookieContainer = cc;
//开始异步接收数据
req1.BeginGetResponse(new AsyncCallback(res =>
{
try
{
HttpWebRequest req2 = (HttpWebRequest)res.AsyncState;
//结束返回的请求数据
HttpWebResponse response = (HttpWebResponse)req2.EndGetResponse(res);
using (Stream stream2 = response.GetResponseStream())
{
StreamReader reader = new StreamReader(stream2);
string resStr = reader.ReadToEnd();
action(resStr);
}
}
catch (Exception)
{
action("network anomaly");//请求失败,网络异常
}
}), req1);
}
}
下面是判断手机的网络状态的代码
public class Utils
{
#region wp联网状态
/// <summary>
/// 获取设备当前的网络状态
/// </summary>
/// <returns></returns>
public static string GetNetStates()
{
var info = Microsoft.Phone.Net.NetworkInformation.NetworkInterface.NetworkInterfaceType;
switch (info)
{
case Microsoft.Phone.Net.NetworkInformation.NetworkInterfaceType.Ethernet: return "Ethernet";
case Microsoft.Phone.Net.NetworkInformation.NetworkInterfaceType.MobileBroadbandCdma: return "CDMA";
case Microsoft.Phone.Net.NetworkInformation.NetworkInterfaceType.MobileBroadbandGsm: return "GSM";
case Microsoft.Phone.Net.NetworkInformation.NetworkInterfaceType.None: return "None";
case Microsoft.Phone.Net.NetworkInformation.NetworkInterfaceType.Wireless80211: return "Wifi";
default: return "None";
}
}
#endregion
}
第一次做wp应用,有点小丑,先上图吧。
页面首页用Panorama布局,有四个栏目,分别是 首页,热门分类,知识库,(个人中心)暂时没做,后期加上。
首先说首页,主要是抓取博客园首页文章列表,然后分析页面后,加载到ListBox中。这里有个我所认为的难点:到页面滚动到底部的时候自动加载下一页。找了好多资料,最后还是找到了,先把主要代码贴出来
1 #region 获取ListBox的滚动条,实现下拉自动刷新 2 private void RegisterScrollListBoxEvent() 3 { 4 List<ScrollBar> controlScrollBarList = UIHelper.GetVisualChildCollection<ScrollBar>(this.artList); 5 if (controlScrollBarList == null) 6 return; 7 8 foreach (ScrollBar queryBar in controlScrollBarList) 9 { 10 if (queryBar.Orientation == System.Windows.Controls.Orientation.Vertical) 11 queryBar.ValueChanged += queryBar_ValueChanged; 12 } 13 } 14 15 async void queryBar_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) 16 { 17 if (probar.Visibility == Visibility.Visible) 18 { 19 return; 20 } 21 ScrollBar scrollBar = (ScrollBar)sender; 22 object valueObj = scrollBar.GetValue(ScrollBar.ValueProperty); 23 object maxObj = scrollBar.GetValue(ScrollBar.MaximumProperty); 24 object minObj = scrollBar.GetValue(ScrollBar.MinimumProperty); 25 26 if (valueObj != null && maxObj != null) 27 { 28 double value = (double)valueObj; 29 double max = (double)maxObj; 30 double min = (double)minObj; 31 32 if (value >= Math.Floor(max)) 33 { 34 probar.Visibility = System.Windows.Visibility.Visible; 35 page += 1; 36 await GetHomeArtcle(page); 37 } 38 39 if (Math.Floor(value) <= min) 40 { 41 42 } 43 } 44 } 45 #endregion