现在WP7的中文学习资料还是非常的少,自己摸索Windows Phone 7有一阵子,现在与大家分享一些自己常用技巧和个人的学习总结,同时也作为自己学习资料,用到时方便查阅,由于个人学习能力和知识有限,如果有错误或者不好之处,欢迎大家拍砖纠正,同时欢迎大家共同交流。 1. ApplicationBar在其它事件中调用的方法 Applicatio
现在WP7的中文学习资料还是非常的少,自己摸索Windows Phone 7有一阵子,现在与大家分享一些自己常用技巧和个人的学习总结,同时也作为自己学习资料,用到时方便查阅,由于个人学习能力和知识有限,如果有错误或者不好之处,欢迎大家拍砖纠正,同时欢迎大家共同交流。
1. ApplicationBar在其它事件中调用的方法
ApplicationBar控件时windows phone 7上的一个菜单,一个ApplicationBar最多可包含四个按钮。如果还有额外的选项可以通过菜单项来添加,这些菜单项默认是不显示的。只有在点击菜单栏右侧的省略号(或省略号下方的区域)时才会显示出来。它传统的Windows程序的菜单的作用类似。
ApplicationBar相信在WP7开发的时候经常会用到,但在页面的其它控件的事件中,如果直接使用他x:Name进行调用,会出现问题....
假如前台代码有个ListBox里的项,我想实现点击某一项时,利用ApplicationBar有个删除按钮(appbarDelete)的删除事件进行删除,因此在未选择任何项时,默认是禁用的(IsEnabled="False"),但点击ListBox某一项激活了之后,该按钮就启用(IsEnabled="True")。
ApplicationBar代码如下:
<phone:PhoneApplicationPage.ApplicationBar>
<shell:ApplicationBar IsVisible="True">
<shell:ApplicationBarIconButton x:Name="appbarDelete" IsEnabled="False" IconUri="/Assets/AppBar/delete.png" Text="删除" Click="appbarDelete_Click"/>
</shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>
ListBox前台接口如下:
<ListBox Name="messageList" SelectionChanged="messageList_SelectionChanged">
<ListBox.ItemTemplate>
<DataTemplate>
<!-- 这里省略 -->
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
ListBox的选中事件代码如下:
privatevoid messageList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (messageList.SelectedItem !=null)
{
appbarDelete.IsEnabled =true; //选中某项时激活ApplicationBar的删除按钮
}
else
{
appbarDelete.IsEnabled =false; //未选中时禁用ApplicationBar的删除按钮
}
}
点击时会出现如下异常NullReferenceException:
这是因为ApplicationBar(ApplicationBarIconButton和ApplicationBarMenuItem)相关的类定义在Microsoft.Phone.Shell命名空间。与UIElement和FrameworkElement等常规Silverlight编程的类层次是完全分开的,严格说来ApplicationBar不是你的页面的可视化的一部分。
因此解决办法如下:
在Xaml构造函数初始化时,加入以下代码即可解决:
public DemoPage()
{
InitializeComponent();
// Re-assign names already in the XAML file
//解决按钮无法调用问题
appbarDelete =this.ApplicationBar.Buttons[3] as ApplicationBarIconButton;
}
注意,一般ApplicationBar有四个按钮,由于这个示例,只有一个按钮。加入上面这句代码之后,就可以解决问题,当我解决之后,点击列表某一项,就激活了删除按钮,我点击删除,就可以删除当前这项信息,如下图:
选中之后状态:
2.IsolatedStorage本地存储的封装类
IsolateStorage是本地存储的实现,具体介绍大家可以查阅相关资料,本次直接从微软Demo封装代码中抽取出来,具体代码如下:
// ---------------------------------------------------------------------------------- // Microsoft Developer & Platform Evangelism // // Copyright (c) Microsoft Corporation. All rights reserved. // // THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, // EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES // OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. // ---------------------------------------------------------------------------------- // The example companies, organizations, products, domain names, // e-mail addresses, logos, people, places, and events depicted // herein are fictitious. No association with any real company, // organization, product, domain name, email address, logo, person, // places, or events is intended or should be inferred. // ---------------------------------------------------------------------------------- using System.IO; using System.IO.IsolatedStorage; using System.Runtime.Serialization.Json; using System.Text; namespace Foolin.Helper { public static class IsolatedStorageHelper { public static T GetObject<T>(string key) { if (IsolatedStorageSettings.ApplicationSettings.Contains(key)) { string serializedObject = IsolatedStorageSettings.ApplicationSettings[key].ToString(); return Deserialize<T>(serializedObject); } return default(T); } public static void SaveObject<T>(string key, T objectToSave) { string serializedObject = Serialize(objectToSave); IsolatedStorageSettings.ApplicationSettings[key] = serializedObject; } public static void DeleteObject(string key) { IsolatedStorageSettings.ApplicationSettings.Remove(key); } private static string Serialize(object objectToSerialize) { using (MemoryStream ms = new MemoryStream()) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(objectToSerialize.GetType()); serializer.WriteObject(ms, objectToSerialize); ms.Position = 0; using (StreamReader reader = new StreamReader(ms)) { return reader.ReadToEnd(); } } } private static T Deserialize<T>(string jsonString) { using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonString))) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T)); return (T)serializer.ReadObject(ms); } } } }
此外,如果你是Windows Phone OS 7.1版本的话,您需要手动添加System.Servicemodel.Web,否则你会出现未找到System.Runtime.Serialization.Json命名空间的错误。
4.NavigationService跳转页面方法和技巧
由于学习WP7才学Silverlight,因此对Silverlight的NavigationService.Navigate();方法特别好用,相当于Asp.net里面的Response.Redirect();,代码如下:
this.NavigationService.Navigate(new Uri("/MyPage.xaml", UriKind.Relative));
但是这个方法只能在Xaml的非构造函数里面使用,如果在构造函数里面使用的话,就会出现异常NullReferenceException:
public LoginPage()
{
InitializeComponent();
//判断是否已经登录
if (Logic.UserLogic.IsLogin())
{
this.NavigationService.Navigate(new Uri("/MyPage.xaml", UriKind.Relative));
}
}
异常信息如下:
这是很多童鞋可能会改为在xaml加载的函数Loaded="PhoneApplicationPage_Loaded"里面使用,但这个会先加载完成xaml页面,再进行跳转,显然不适合例如登录验证跳转这些方法,这是可以重写OnNavigatedTo()方法里面完成,解决办法如下:
///<summary>
/// 重写方法
///</summary>
///<param name="e"></param>
protectedoverridevoid OnNavigatedTo(NavigationEventArgs e)
{
//判断是否已经登录
if (Logic.UserLogic.IsLogin())
{
this.NavigationService.Navigate(new Uri("/MyPage.xaml", UriKind.Relative));
}
}
这样就解决了页面加载前的跳转。
5.指定某个Xaml页面为默认启动页设置
最后因时间问题,太晚了,明天还要上班哦,囧...! 简单介绍一下WP7是如何修改默认启动页,这对初学者应该还是比较迷惑的,修改默认启动页设置在项目的Properties/WMAppManifest.xml文件里面找到如下节点:
<Tasks>
<DefaultTask Name ="_default" NavigationPage="LoginPage.xaml"/>
</Tasks>
例如我把MainPage.xaml改为LoginPage.xaml页面。
结束语:因太晚了,明天还要上班...... 相信很多童鞋都笑而不语,这叫晚啊?在这个时候都是会觉得还特别早,说不定还有很多童鞋在加班赶项目呢,但大家还是要提醒大家照顾好自己身体,注意好休息,所以暂时写这几个,以后在不断学习中还会写一些总结或者想法与大家交流,刚才说的几点由于我个人理解不透或者错误之处,请大家拍砖指正,在这凌晨的时候,跟大家说声“早安”!
原文地址:http://www.cnblogs.com/foolin/archive/2011/09/06/2168219.html