这是一个抓取学校教务网站课表信息的小应用,总体来说比较简单,但是制作过程中还是遇到了几个问题,在这里和大家交流分享一下。
第一个是web数据的传输,在wp7中不支持GetResponse这样同步获取响应数据的,只能以异步传输的形式完成。这个问题是当时在cmd里测试不会发现的,后来查询了一些资料,获取web数据需要通过异步的方法获取响应数据。
Uri myurl = new Uri(strrequesturl); HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(myurl); webRequest.Method = "GET"; webRequest.BeginGetResponse(new AsyncCallback(handleResponse), webRequest);
/// <summary>
/// 异步响应回调函数
/// </summary>
/// <param name="asyncResult">异步请求参数</param>
private void handleResponse(IAsyncResult asyncResult) { string result = ""; bool iserror = false; try { HttpWebRequest webRequest = asyncResult.AsyncState as HttpWebRequest; HttpWebResponse webResponse = (HttpWebResponse)webRequest.EndGetResponse(asyncResult); Stream streamResult = webResponse.GetResponseStream(); //获取响应流 StreamReader reader = new StreamReader(streamResult); result = reader.ReadToEnd(); } catch (Exception ex) { iserror = true; result = ex.Message; } }
这里提醒一下大家,网上有的示例会用allDone.WaitOne()和allDone.Set()的方法来等待异步回调线程,实测WaitOne会让主线程停掉,整个程序呈假死状态。如何等待异步传回来的数据成了我不知如何解决的问题。本应用是在获取数据之后进行页面跳转,无奈只好将跳转语句写在了回调函数里......这肯定有破坏我获取数据的类的结构,如果有大神知道解决方法请告诉小弟。
第二个问题是关于hubtiles这个控件的,我需要用这个控件来显示课表的信息,网上关于hubtiles的文章貌似都是同一篇(http://www.cnblogs.com/xingfuzzhd/archive/2011/11/18/2254419.html),这篇文章说实话,你要了解的最基础的东西里面都有。但是对于我的需求来说,首先我不需要显示图片,第二我需要在hubtile上显示3种信息(第几节课,课程名,上课地点),第三hubtile的默认翻转太慢,缺乏互动性,而且有个state的文字是倒着的。
于是我开始对hubtile进行样式上的修改。
在hubtile控件上右键选择编辑模板-编辑副本
由于Border里的那个TextBlock默认绑定的是title,这样的话,我们只能显示title和Message两种信息,而我需要的是tile、Message、Notification,这个怎么办呢,hubtile属性里有一个DisplayNotification,给他设置为true,Notification就可以显示了,但是这样的话Message就没了,我们把模板中Border下的TextBlock绑定为Message就可以同时显示三个信息。
我现在需要tile只显示两种状态,一个是(状态A),一个是(状态B),对状态删删减减之后变成了这个样子。
当然两种状态之间的转化是有上下浮动的动画的。
不过至今我不知道在哪里去改hubtile自动切换状态的间隔时长。。。。。。
下面就是增加交互性,进入课表,同学们看到的tile状态是A,当点击tile之后,变为B状态显示当节课的具体信息。我们在hubtile的属性里加入Tap事件,给tile的tag赋为0,IsFrozen设为True。在Tap事件中加入以下代码:
private void hubtile_Tap(object sender, System.Windows.Input.GestureEventArgs e) { HubTile hubtile = sender as HubTile; if (hubtile.Tag.Equals("0")) { VisualStateManager.GoToState(hubtile, "Collapsed", true); hubtile.Tag = "1"; } else { VisualStateManager.GoToState(hubtile, "Expanded", true); hubtile.Tag = "0"; } }
这样我们就能像按开关一样控制hubtile了。
第三个问题说一下数据绑定,数据绑定可以参考我上面说的那篇文章,不过做这个应用时我有点犯二,我绑定时对Name也进行了绑定,这样VS会报出一个无效指针的错误,希望大家可以注意。
<ListBox x:Name="tileList1" Margin="8,8,45,78"> <ListBox.ItemsPanel> <ItemsPanelTemplate> <toolkit:WrapPanel Orientation="Horizontal"/> </ItemsPanelTemplate> </ListBox.ItemsPanel> <ListBox.ItemTemplate> <DataTemplate> <toolkit:HubTile Style="{StaticResource HubTileStyle}" Title="{Binding Title}" IsFrozen="True" Margin="3" Notification="{Binding Notification}" DisplayNotification="True" Message="{Binding Message}" GroupTag="{Binding GroupTag}" Tap="hubtile_Tap" Tag="0"> <toolkit:HubTile.Background> <ImageBrush Stretch="Fill" ImageSource="images/tileBg.png"/> </toolkit:HubTile.Background> </toolkit:HubTile> </DataTemplate> </ListBox.ItemTemplate> </ListBox>
public class TileItem { public string Title { get; set; } public string Notification { get; set; } public string Message { get; set; } public string GroupTag { get; set; } } void InitializeItem(ListBox titleList,int weekNum) { List<TileItem> tileItems = new List<TileItem>(); int nowWeek = GlobleTTdata.weekNum; #region for (int i = 0; i < 6;i++ ) { TileItem tileitem = new TileItem(); tileitem.Message = (i * 2 + 1).ToString() + "-" + (i * 2 + 2).ToString() + "节"; tileitem.GroupTag = "MondayTile"; switch (myTT[weekNum, i].ClassCount) { case 0: tileitem.Title = "无课"; tileitem.Notification = ""; break; case 1: if (myTT[weekNum, i].ClassWeek[0].Contains(nowWeek)) { tileitem.Title = myTT[weekNum, i].TTName[0]; tileitem.Notification = myTT[weekNum, i].ClassAddr[0]; } else { tileitem.Title = "无课"; tileitem.Notification = ""; } break; case 2: if (myTT[weekNum,i].ClassWeek[0].Contains(nowWeek)) { tileitem.Title = myTT[weekNum, i].TTName[0]; tileitem.Notification = myTT[weekNum, i].ClassAddr[0]; } else if (myTT[weekNum, i].ClassWeek[1].Contains(nowWeek)) { tileitem.Title = myTT[weekNum, i].TTName[1]; tileitem.Notification = myTT[weekNum, i].ClassAddr[1]; } else { tileitem.Title = "无课"; tileitem.Notification = ""; } break; } tileItems.Add(tileitem); } #endregion titleList.ItemsSource = tileItems; }
应用的下载地址:http://pan.baidu.com/share/link?shareid=132879&uk=2382737209 不过相信大多数博友没有我们学校教务网的账号。。。。。。
欢迎访问倾剑飞血的更多博文:http://www.cnblogs.com/jacklandrin/
同时,欢迎大家来拍砖~