您的位置:首页 > 其它

Windows Phone 7常用的开发技巧&学习总结

2012-11-20 23:20 471 查看
现在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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: