這是一個抓取學校教務網站課表信息的小應用,總體來說比較簡單,但是制作過程中還是遇到了幾個問題,在這里和大家交流分享一下。
第一個是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/
同時,歡迎大家來拍磚~