zoukankan      html  css  js  c++  java
  • 制作天津理工课表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/

    同时,欢迎大家来拍砖~

  • 相关阅读:
    一个苏州IT人的5年挨踢经历经历篇(之二)
    【Java】Collection 集合框架概述
    【Java】Collection子接口:其二 Set 组接口
    【Java】【常用类】Calendar 日历类
    【郝斌C ST】01
    【Java】【常用类】Date 日期类
    【Java】Enumeration Class 枚举类
    【Java】Properties 配置信息类
    【Java】Generic 泛型
    【Java】Annotation 注解
  • 原文地址:https://www.cnblogs.com/jacklandrin/p/2765139.html
Copyright © 2011-2022 走看看