制作天津理工課表WP7版的總結


這是一個抓取學校教務網站課表信息的小應用,總體來說比較簡單,但是制作過程中還是遇到了幾個問題,在這里和大家交流分享一下。

第一個是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/

同時,歡迎大家來拍磚~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM