手把手教你写天气预报_第1页
手把手教你写天气预报_第2页
手把手教你写天气预报_第3页
手把手教你写天气预报_第4页
手把手教你写天气预报_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

此文档供上网不便的朋友使用,仅供学习交流使用。 此文档不能复制,鼓励手敲代码,毕竟拖控件粘代码始终是不 好的事情。如果实在是需要,可以到博客上面来复制代码 /fengyun1989/article/details/7346223 另外,此文档由于做得倡促,写博客的时候随便粘过来的。没 有好好排版,如果看得不爽请到博客里看原文。 (一)手把手教你写天气预报程序:序言 先来展示下程序的效果图吧 这个程序虽小,但是基本的东西都是具有的。说下用到的具有特色 的知识点(简单的不说了):UserControl ,WebClient 请求,Json 数 据解析,XML 数据解析,TombStone ,IsolatedStorage 存储,本地数 据库 SQL CE。 上面的每个知识点要写都是一个 Demo。此例子展示怎么将所有知 识点联系到一块做一个实在的应用。 Window phone 开发,我感觉现在这样的中文实例教程很少。我的英 语水平也不好,按照教育部的说法,六级没过,那些神马英文教程, 勉强能看,但那也是相当纠结的事情。我估计还有不少不爱看英文 教程,看到英文就头疼的爱好 WP7开发的入门者,所以打算写这么 一个教程,尽量详细到每一步,尽量把分析思考写出来。如写的不 好,尽请见谅。 写一个新手看的懂,让他们能做出这么一个可以用的应用增加一点 自信心。 最后一句:新手请进,老鸟飘过 (二)手把手教你写天气预报程序:UserControl 的运用 那么,开始吧。首先确认安装了 window phone SDK(没有的先去安装,SDK 自带 VS2010 Express 版,还有就是电 脑系统要是 win7,XP 不支持微软原版的模拟器,不过可以使用传 智播客做的模拟器,具体自己百度) 。如果本来安装了 VS2010 ultimate 的。可以用之开发,但是确认升级到了 SP1版,不然不能使 用,而且,如果本来的 VS2010是中文版,那么需要到 C:Program FilesMicrosoft Visual Studio 10.0Common7IDEProjectTemplatesCSharp(C 盘为 SDK 安装目录) ,复制 Silverlight for Windows Phone 文件夹(此为 window phone 模板) 到 C:Users用户名DocumentsVisual Studio 2010TemplatesProjectTemplatesVisual C#下,这样原来的中文版 VS2010就能识别 window phone 模板了。 打开 VS2010。无论你打开的是中文版的还是英文版的, 我用的是中文版的,我下面所说的操作大部分都是中文的。如果你 英文不好还要用英文版的(虽然基本没几个英文单词) ,如果找不到 我也没办法了(不过大部分应该都附图) 。 点击文件-新建- 项目,在左边的模板里面选择 visual C#,然后再选择 silverlight for window phone,然后在右边选择 window phone application。填入名称:WeatherForecast 具体如下 图: 点击确定。 然后在这个弹窗,选择 OS 7.1, 点击 OK。 现在也可以点击运行。 运行方法:先看这 绿色三角后面选择的是 Emulator,就是模拟器。还 有一个选项是 Device,就是手机。确认选择的是模 拟器,点击绿色三角或者按 F5 运行。运行成功! 我觉得这么一个程序,首先应该要能够获取到天气信 息展示到界面。先分析下界面应该怎么做吧。新手看 到这么复杂的界面大部分还真是无从入手。 观察界面,就是一个 Grid 的布局。但是麻烦的是右边的预报后几天 天气的布局。单靠 grid 布局达不到如此效果。 所以把这做成 UserControl。这样更容易布局。也可以展示下 UserControl 的应用。 现在,先添加一个 UserControl。在右边的解决方案管理器,在 WeatherForecast 上右键,添加,新建项。添加一个 window phone user control。命名为 ForecastTemplate,点击添加,如图: 在 ForecastTemplate.xaml。里面的 name 为 LayoutRoot 的 grid 里面 添加两个 TextBlock,一个 Image。 具体代码如下: 现在在左边的设计框显示的是这样的: 我们需要从外部给这个 UserControl 的 Textblock 或者 Image 的属性 赋值,那么需要给 ForecastTemplate 这个类添加成员变量来控制 Textblock 或者 Image 的属性。那么。转到 ForecastTemplate.xaml.cs 页面。也就是在 ForecastTemplate.xaml 的代码页面,右键,查看代 码。就看到了。 在 ForecastTemplate.xaml.cs 页面,在 ForecastTemplate 类中添加如下的成员。 /定义 Image 的 Source 属性。这样这个用户控件就能从外面访问到这个 Image 控件的 Source 属性了 private string _imageUri; public string ImageUri get return _imageUri; set _imageUri = value; BitmapImage bmp = new BitmapImage(new Uri(value, UriKind.Relative); WImg.Source = bmp; /定义了 TextBlock 的 Text 属性。外头就可以给这个 Text 属性赋值了 private string _weekday; public string Weekday get return _weekday; set _weekday = value; ; weekday.Text = value; private string _temp; public string Temp get return _temp; set _temp = value; temp.Text = value; 是否发现在这显示红色波浪线? 因为没有引入命名空间。在 BitmapImage 上右键。 解析,选择第一个 Using。这样就引入了命名空间。 这里提这个主要是给新手提个醒,遇到错误不要着急。 先看清楚是什么状况。解决就好了。 现在转到 MainPage.xaml 页面。先添加命名空间。 xmlns:my=“clr-namespace:WeatherForecast“ 贴图展示命名空间添加位置 正确添加命名空间。智能提示就能访问到 Usercontrol 现在添加一些图片资源文件到工程。我这工程添加的 图片资源可以到这下载: http:/115.com/file/dp7pzdp2#Images.zip, 直接右键解压到 Images 文件夹。然后复制整个 Images 文件夹到工程里,具体操作:复制文件夹, 然后解决方案资源管理器右键 WeatherForecast 这个 工程,选择粘贴就完成了引入资源到工程。 现在到 MainPage.xaml 中添加代码: Name 为 contentPanel 的 grid 添加代码。 一开始 ForecastTemplate 下面会显示蓝色波浪线,而 且在设计框里也不显示控件。运行一次就好。运行一 次后,在设计框里显示如下: 好了,这一节就到这吧。省得篇幅太长了。这节主要 介绍了 UserControl 的运用。如有问题可以直接留言。 这节工程代码下载:http:/115.com/file/c2p2kzsh#chapter2.zip (三)手把手教你写天气预报程序:运用 WebClient 获 取天气和 json 数据解析 上一节我们练习了 UserControl,这次我们就要把 UserControl 运用到实际的布局上面来。 首先,把 MainPage 中的原来的测试 UserControl 的代码 删除,在 ContentPanel 添加代码: 在设计框显示如下: 这样界面就这样吧。感觉也没啥好说的。 现在看 WebClient。 在 点击图中的右下角 用红框选择的小按钮或者点击文档大纲。 选择 PhoneApplicationPage。选择好了。随意找个地点击一下,就成 了图中的显示样子。 然后选择属性 这里显示的是 PhoneApplication 的属性。如果不是。 重新点击 然后在属性页面选择事件: 然后找到 Loaded,在右边的框框双击,生成了一个 PhoneApplicationPage_Loaded 事件。编译器自动帮你导向了事件处 理 在这个 Loaded 事件中,我打算用 WebClient 获取天气信息。并且显 示到界面上。 获取天气,就要用到天气预报 API。免费的 API 可以看我写的这个: /fengyun1989/article/details/7341166。我用的天气 预报 API 是中央气象台的。主要是因为这个 API 能够获取到县城的 天气信息。而且预报的信息很全。缺点就是我只收集到了大约10个 省份的城市代码。 这节我们就获取北京的天气。用到的 Url 是: /data/101010100.html 返回的数据相当的多(因为详细,json 数据): “weatherinfo“:“city“:“北京“,“city_en“:“beijing“,“date_y“:“2012年3月11日“,“date“:“,“week“:“ 星期日“,“fchh“:“11“,“cityid“:“101010100“,“temp1“:“6 -6“,“temp2“:“9-2 “,“temp3“:“130“,“temp4“:“11- 1“,“temp5“:“91“,“temp6“:“103“,“tempF1“:“42.821.2“,“tempF2“:“48.228.4 “,“tempF3“:“55.432“,“tempF4“:“51.830.2“,“tempF5“:“48.233.8“,“tempF6“:“50 37.4“,“weather1“:“晴“,“weather2“:“晴“,“weather3“:“ 多云转晴“,“weather4“:“ 晴转多云 “,“weather5“:“多云转阴“,“weather6“:“阴 “,“img1“:“0“,“img2“:“99“,“img3“:“0“,“img4“:“99“,“img5“:“1“,“img6“:“0“,“img7“:“0“,“img8“:“1“, “img9“:“1“,“img10“:“2“,“img11“:“2“,“img12“:“99“,“img_single“:“0“,“img_title1“:“晴 “,“img_title2“:“晴“,“img_title3“:“晴“,“img_title4“:“晴“,“img_title5“:“多云“,“img_title6“:“晴 “,“img_title7“:“晴“,“img_title8“:“多云“,“img_title9“:“多云“,“img_title10“:“阴“,“img_title11“:“阴 “,“img_title12“:“阴“,“img_title_single“:“ 晴“,“wind1“:“微风“,“wind2“:“微风“,“wind3“:“ 微风 “,“wind4“:“微风“,“wind5“:“ 微风“,“wind6“:“ 微风“,“fx1“:“微风 “,“fx2“:“微风“,“fl1“:“小于3级 “,“fl2“:“小于3级“,“fl3“:“ 小于3级“,“fl4“:“小于3级“,“fl5“:“ 小于3级“,“fl6“:“小于3级“,“index“:“冷 “,“index_d“:“天气冷,建议着棉衣、皮夹克加羊毛衫等冬季服装。年老体弱者宜着厚棉衣或 冬大衣。“,“index48“:“凉“,“index48_d“:“天气凉,建议着厚外套加毛衣等春秋服装。体弱者 宜着大衣、呢外套。因昼夜温差较大,注意增减衣服。“,“index_uv“:“中等“,“index48_uv“:“ 中等“,“index_xc“:“适宜“,“index_tr“:“适宜“,“index_co“:“较舒适“,“st1“:“6“,“st2“:“- 4“,“st3“:“8“,“st4“:“0“,“st5“:“13“,“st6“:“2“,“index_cl“:“较不宜“,“index_ls“:“基本适宜 “,“index_ag“:“易发“ 我们先新建一个类老保存需要的天气信息。在工程上右键。添加。类。命名为 WeatherInfo.cs,点击添加。 添加如下成员变量: public string city get; set; public string cityid get; set; public string date_y get; set; public string week get; set; public string temp1 get; set; public string temp2 get; set; public string temp3 get; set; public string temp4 get; set; public string temp5 get; set; public string weather1 get; set; public string weather2 get; set; public string weather3 get; set; public string weather4 get; set; public string weather5 get; set; public string wind1 get; set; public string info get; set; /index48_d PS:展示一个小技巧,添加成员变量快捷方式:prop + tab + tab.编 译器就能自动完成,剩下的修改下类型和命名就行了,如图: 保存。现在回到 MainPage.xaml.cs。 给 PageLoad 添加代码: WebClient wb = new WebClient(); /添加下载完成后的处理事件 wb.DownloadStringCompleted+=newDownloadStringCompletedEventHandler(wb_Downloa dStringCompleted); /开始异步下载 wb.DownloadStringAsync(new Uri(“/data/101010100.html“, UriKind.Absolute); 在这里敲 wb.DownloadStringCompleted 的时候,后面的+= ,然后是 tab ,tab,编译器就能帮 助你自动生成处理函数。 如下: void wb_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) throw new NotImplementedException(); 现在要在下载完成的事件里做 json 数据处理并且赋值给控件。 Json 数据处理我用的是 Jobject 类,这个类使用起来很方便。其他的 也做过尝试,但是由于要处理的数据的复杂性,使用起来相当麻烦。 要用到 JObject 这类要到 /下载这个类的 dll。 下载最新版,完成后,解压,现在就添加 DLL 到工程里面。 具体操作如下:工程-右键- 添加引用- 浏览,找到刚才解压的目 录,并且到 BinWindowsPhone 下- 选择哪个 dll 文件-确定 在 MainPage.xaml.cs 中引入命名空间 using Newtonsoft.Json; using Newtonsoft.Json.Linq; 并且为 MainPage 类添加两个城员变量。 WeatherInfo weather = null; /定义星期属性,以便能得出后面的日期 string weekMsg = “星期一“, “星期二“, “星期三“, “星期四“, “星期五“, “星期六“, “ 星期日“ ; 然后给下载完成函数添加如下代码: void wb_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) if (e.Result.Length / 下载完成后的处理事件 / / / void wb_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) /判断是否下载成功 if (e.Result.Length / 更新 UI 信息 / void UpdateUI() day1.Temp = weather.temp2; day2.Temp = weather.temp3; day3.Temp = weather.temp4; day4.Temp = weather.temp5; todaytemp.Text = weather.temp1; todayWhe.Text = weather.weather1 + Environment.NewLine + weather.wind1; todaydate.Text = weather.date_y + Environment.NewLine + weather.week; wtInfo.Text = ; PageTitle.Text = weather.city; int i; for (i = 0; i / 返回天气图片的 Uri。图片的 Building 属性为 Resource / / / String GetImgUri(string weather) string uri = “/WeatherForecast;component/Images/“; if (weather = “晴“) return uri + “sunday.jpg“; else if (weather = “阴“) return uri + “overcast.jpg“; else if (weather = “雷阵雨“) return uri + “ThunderShower.jpg“; else if (weather.Contains(“多云“) return uri + “cloudy.jpg“; else if (weather.Contains(“雨“) return uri + “Rain.jpg“; else return uri + “cloudy.jpg“; 点击运行: 好了。这节就到这了。如果有任何问题,就留言吧。 这节代码下载: http:/115.com/file/c2p2sa1h#chapter3.zip (四)手把手教你写天气预报程序:本地数据库 SQL CE,XML 数据解析 Windows Phone 的本地数据库 SQL Server CE 是7.1版本即芒果更新 的新特性,所以你要在应用程序中使用 SQL Server CE 数据库必须 使用 Windows Phone 7.1的 API 才行 。这个数据库是用 Linq 来执行 查询等操作。 我们现在用数据库来保存城市的数据,包括所属省份,城市名称, 城市代码。在程序中我们只做了简单的插入和查询,需要详细的数 据库操作可以参考 /tips/Windows-Phone- Mango-Local-Database(SQL-CE)-Introduction 或者 MSDN。 现在回到工程上,先创建一个数据表,CityInfoTable. 在工程上右键-添加-类。命名为 CityInfoTable.cs ,接着添加引 用。工程-右键-添加引用。 找到 System.Data.Linq.点击确定。 接着在 CityInfoTable.cs 添加命名空间。 using System.Data.Linq.Mapping; using System.ComponentModel; 然后在 CItyInfoTable 这个数据表定义主键等属性,给出完整的 CityInfoTable.cs 代码 using System; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Ink; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.Data.Linq.Mapping; using System.ComponentModel; namespace WeatherForecast Table/把 CItyInfoTable 定义为表 public class CityInfoTable /定义表的自增 ID。设置为主键 private int _cityInfoid; /Column 这个是定义一个成员为表字段。如果没有这个,那么这个成员不是字段 Column(IsPrimaryKey = true, IsDbGenerated = true, DbType = “INT NOT NULL Identity“, CanBeNull = false, AutoSync = AutoSync.OnInsert) public int CityInfoid get return _cityInfoid; set _cityInfoid = value; /定义省份名称: private string _province; Column public string Province get return _province; set _province = value; /定义城市名称 private string _cityName; Column public string CityName get return _cityName; set _cityName = value; /定义城市代码 private string _cityCode; Column public string CityCode get return _cityCode; set _cityCode = value; 现在再定义一个数据库。工程-右键- 新建类,命名为 CityDataContext.cs。 添加命名空间。 using System.Data.Linq; 然后让这个类继承于 DataContext。 给出 CityDataContext.cs 的完整代码: using System; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Ink; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.Data.Linq; namespace WeatherForecast / / 定义一个数据库 / public class CityDataContext : DataContext /定义数据库连接字符串 public static string connectionString = “Data Source=isostore:/CityInfo.sdf“; / 传递数据库连接字符串到 DataContext 基类 public CityDataContext(string connectionString) : base(connectionString) /定义一个数据表,如果有多个数据表也可以继续添加为成员变量 public Table CityInfos get return this.GetTable(); 到这里,数据库算是写好了。新手肯定会有疑问,没有看到什么数据库。也没在工程里面 看到什么 SDF 文件。 因为,我们要在程序构建的时候用代码创建数据库,由上面的连接 字符串可以知道,数据库创建后放在 Isolatedstorage 里面,创建这个 在 App.xaml 里面的 Launching 事件里面实现。 可以在这个事件里添加这样的代码创建数据库: using (CityDataContext db = new CityDataContext(CityDataContext.connectionString) if (db.DatabaseExists() = false) /创建一个数据库 db.CreateDatabase(); 这个我们暂时不做。现在我们先添加一个城市信息的 XML 文件。下载: http:/115.com/file/anme1scg#citycode.xml 复制这个文件。在工程上面右键-粘贴。就把这个 citycode.xml 文件 加入到了工程上。 接下来就做 XML 解析。用的 XDocument 类。这里只是简单应用了 下。 我们要在 App.xaml 里面的 Launching 事件添加代码。因为我们要在 初次运行程序的时候要建立数据库,并且解析 citycode.xml 的数据 添加到数据库里面。 要读取工程里面的文件。要用到的是 Application.GetResourceStream. 这个函数只能读取资源文件。那么我们要将 citycode.xml 文件的 Building 属性改为 Resource。 操作方法:选择 citycode.xml-点击属性-生成操作(Building)改 为 Resource。 要使用 XDocument 类,需要添加引用。添加 System.Xml.Linq。已 经添加很多次引用了,那么这次就不详细说怎么操作了。 在 App.xaml.cs 里面添加命名空间; using System.Windows.Resources; using System.IO; using System.Xml.Linq; 添加成员函数: private void CreatDB() using (CityDataContext db = new CityDataContext(CityDataContext.connectionString) if (db.DatabaseExists() = false) /创建一个数据库 db.CreateDatabase(); /读取资源文件。文件为 XML 格式。这个文件的 Building 属性为 Resource StreamResourceInfo sri = Application.GetResourceStream(new Uri(“/WeatherForecast;component/citycode.xml“, UriKind.Relative); /读取所以数据保存到 String 类型的 result 中 string result; using (StreamReader sr = new StreamReader(sri.Stream) result = sr.ReadToEnd(); /用 XDocument 类解析数据 XDocument doc = XDocument.Parse(result); /解析数据并且存入数据库 foreach (XElement item in doc.Descendants(“root“).Nodes() /由文件中的数据可以知道。我们需要的数据在那么两个节点。 Descendants 就是寻找子节点。 string province = item.Attribute(“data“).Value; foreach (XElement itemnode in item.Descendants(“city“) string cityname = itemnode.Element(“cityname“).Value; string cityid = itemnode.Element(“cityid“).Value; /把数据存入数据库 CityInfoTable cityInfo = new CityInfoTable(); cityInfo.CityCode = cityid; cityInfo.Province = province; cityInfo.CityName = cityname; db.CityInfos.InsertOnSubmit(cityInfo); /数据库提交更新 db.SubmitChanges(); 在 Launching 事件添加如下代码: CreatDB(); 这样,我们就能在第一次执行程序的时候,创建数据库,并且解析 XML 数据,把城市信 息存入数据库。 那么还是测试下吧。 在 MainPage 的 Loaded 事件中测试,查询北京的数据,弹窗显示。 在 Loaded 事件中添加如下代码: using (CityDataContext db = new CityDataContext(CityDataContext.connectionString) IQueryable queries = from c in db.CityInfos where c.Province = “北京“ MessageBox.Show(queries.First().CityName + queries.First().CityCode); 成功!那么就把刚才添加的测试代码注释掉吧。 。 。 PS:调试数据库,XML 解析的时候我可是相当纠结了。都是心理默 念不要出错,不要出错。 。 。 因为出错的话,数据库是建立了。但是数据八成没有加入进去。要 删除数据库,就要重启模拟器了。因为重启模拟器 IsolatedStorage 里面的数据就没了。但是,我的机子如果重启模拟器的话,没有个 五六分钟不行。 。多出错几次半小时都没了。 。 提示:如果在建立数据库处出错了。记得重启模拟器再调试。 本节就这样吧。本节工程代码: http:/115.com/file/c2p8e5g0#chapter4.zip (五)手把手教你写天气预报程序:ApplicationBar 的使用和 ListPicker 的数据绑定 这一节,我们要做的是把设置界面写好。不好以为那么容易,因为 涉及到 ListPicker 的数据绑定,而且数据是从数据库里面查询获取 的,所以并不是拖连个控件就可以完成的事,不过,拖控件不是件 好事,要尽量避免。 那么开始吧。首先,先把设置界面添加进来。工程-添加-新建项- -window phone protrait page-命名为“SetPage.xaml“-添加。 接下来要做的是要从 MainPage 导航到 SetPage。那么怎么做呢? 我的方法是在 ApplicationBar 放置一个 Button 来用作导航到 SetPage 的入口。 那么,来释放 ApplicationBar 出来吧。看下图,其实微软早已为我 们写好了 ApplicationBar 了。只要去掉注释就行了。原来自动生成 的 ApplicationBar 带有2个 Icon 按钮,和两个下拉菜单按钮。我们暂 时只需要一个按钮就行了。 修改如下: 运行,是不是发现那个按钮没有显示图标。 。因为那个图标路径是不 对的。 现在到 SDK 的安装目录把图标弄出来吧。到 C:Program FilesMicrosoft SDKsWindows Phonev7.1Iconsdark(C 为 SDK 安装 目录)下。找到 appbar.feature.settings.rest.png。复制。然后到解决 方案资源管理器,在工程上右键-添加- 新建文件夹- 命名为 Icons-在 Icons 文件夹上面右键-粘贴。 然后修改 ApplicationBar 上的代码为: 现在还有一个重要的事情要做的是修改 Icon 的文件生成属性。 操作方法:解决方案资源管理器选中那个 Settings 图标文件-属性- -生成操作- 改为:内容( Content) 。 接着,运行。是否已经看到图标了呢。 。 。 看上图,是否发现图标是出来了。但是原来显示很正常的内容就少 了挺多被挡住了呢。 。 那么怎么能够看到被挡住的内容呢,我们给界面加个滚动就可以了。 ScrollViewer 就上场了。 在 MainPage 里面给 ContentPanel 添加 ScrollViewer。 如下: 注意:ScrollViewer 的 Height 属性是指显示的高度,不是这个 viewer 所有的长度。如果弄这个值过大,会导致你一拖下去就回弹, 下面的内容就不容易看清楚了。 点击运行。是不是拖下去能够正常看到了呢。 接下来,要给 ApplicationBar 的 iconButton 添加点击事件。添加方法 都挺多的。一种就是选择这个 Button。然后查看属性面板-选择事件 -在 Click 上面双击-完成. 我倒喜欢另一种快捷方式。是手敲代码方式。在代码框上面敲击 c+tab+tab. 敲击“C“出现这样: 然后”TAB“ 继续“TAB ”。 完成了事件生成,然后在上面右键。选择导航到事件处理程序。这样就导航到 MainPage.xaml.cs 了。 在上面添加代码: private void ApplicationBarIconButton_Click(object sender, EventArgs e) NavigationService.Navigate(new Uri(“/WeatherForecast;component/SetPage.xaml“, UriKind.Relative); 点击运行。是不是发现现在点击那个 IconButton 可以导航到 SetPage 页面了呢。 接下来就做 SetPage 的布局。这里要使用到 ListPicker。这个是 silverlight for window phone toolkit 提供的。没有安装的话到这里下 载安装:/releases/view/55034 转到 SetPage.xaml 页面,在 ContentPanel 添加代码。 要先添加 tookit 的命名空间,但是那行代码太长,我 不喜欢敲,那么就来拖一把控件吧。拖一次编译器就 给我们引入了命名空间(你会在第一行发现引用) , 就下次就不用再拖了。拖控件很不好,这里展示一下技巧。 查看工具箱-找下是否有 ListPicker 控件(一般来说第一次使用的时 候是没有的)-发现没有,在工具箱右键-选择项- 找到 ListPicker,勾上-确定。然后你就能在工具箱上发现 ListPicker 了。如下图: 下面是 SetPage 的布局代码: 先给 Provincelp 添加一个 SelectionChange 事件。 现在添加 SetPage 的 Loaded 事件,在 Loaded 事件要添加 ListPicker 的数据绑定。 由于这个中央气象台我收集到的省份较少。我就直接写成是 String 数组,没有从数据库里面查询数据。 代码如下: string prov = “北京“, “上海“, “天津“, “重庆“, “黑龙江“, “吉林“, “辽宁“, “内蒙古“, “河北“, “ 山西“, “陕西“ ; private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) /给省份的 listpicker 绑定数据 provincelp.ItemsSource = prov; private void provincelp_SelectionChanged(object sender, SelectionChangedEventArgs e) ListPicker lp = sender as ListPicker; string p = lp.SelectedItem.ToString(); cityDataBind(p); / / 由当前选择的省份给 city 的 ListPicker 绑定数据 / / void cityDataBind(String prov) IList list = null; using (CityDataContext db = new CityDataContext(CityDataContext.connectionString) IQueryable queries = from c in db.CityInfos where c.Province = prov select c; list = queries.ToList(); List l = new List(); foreach (var item in list) l.Add(item.CityName); citylp.ItemsSource = l; 运行,成功! 好了,到这里,这节就算是结束了。 这节工程代码下载: http:/115.com/file/be2cmebp#chapter5.zip (六)手把手教你写天气预报程序:使用 Isolatedstorage 保存设置 上一节完成了 SetPage 的布局和数据绑定。这一节就要做设置页面和 主页面的交互了。 我们在主页面点击设置按钮的时候,是不是应该给设置页面传一个参 数?比如城市名称?还有在设置页面 ListPicker 应该选择的是当前选 择的地区,不然每次都是两个北京就显得很不友好了。 我们在 SetPage 怎么知道是当前选择的地区呢。给另一个界面传参数 可以考虑用 Uri 的方法,比如/SetPage.xaml?cityname=“ 长安“ ,然后 从 URi 里面把参数取出来, NavigationContext.QueryString“cityname“取出来值。但是这里我不 考虑这方法,因为我的选择城市只有一个,直接保存到 Isolatedstorage 就行了。在 SetPage 里面再取出来。不过大部分程序 还得用传参数形式,毕竟不能写多个页面,要一个页面多用嘛。举个 简单的例子,QQ 的聊天框,总不能给每个好友都自定义一个 吧。 还有就是天气更新问题,从 SetPage 设置后重新回到 MainPage,天 气是否需要更新呢,这个也是个问题,如果人家没改选择也点击保存 后回到 MainPage,更新是否太浪费了。在这个流量还是很贵的时代。 还有就是每次启动程序进入的时候都要更新么,毕竟服务器那头数据 没有更新,这头客户端去请求,返回的数据和原来的一样,又是浪费 流量浪费电量。window phone 其实有一个叫推送的东西,这个东西简 单来说就是服务端有更新,就通过推送通知客户端更新,这样,即省 了流量也省了电量。但是在这里就不展示推送的编写过程了。 所以,我自己制定的规则是:保存上一次更新的天气数据。然后从 SetPage 回来判断下城市是否相同,不同更新,更新时间是否超过3小 时,超过更新。 那么就开始做吧。 先在 SetPage 页面的 ApplicationBar 添加一个 IconButton。图标用的 是 Dark 文件夹下的 appbar.save.rest.png。复制到工程的 Icons 目录。 并且修改生成操作属性为内容。这不懂操作的参考上一节。并且添加 click 事件。 先添加一个类来保存选择的城市信息。工程-右键-添加- 类-命 名为 SelectedCity.cs-添加。 在 SelectedCity.cs 上,首先添加命名空间 using System.IO.IsolatedStorage; 这里附上 SelectedCity.cs 完整代码: using System; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Ink; using System.Windows.Input; using

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论