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

      现在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的选中事件代码如下:

复制代码
        private void 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封装代码中抽取出来,具体代码如下:

复制代码
View Code
// ----------------------------------------------------------------------------------
// 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命名空间的错误。

 

3.MD5加密的实现类

 WP7木有提供MD5加密的方法,可是这个经常会用到,网上找了一个MD5的方法,直接上代码:

 

调用方法如下:

string password = "IamFoolin";

password
= MD5.GetMd5String(password); //MD5加密

 

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>
protected override void 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页面。

 

 

结束语:因太晚了,明天还要上班...... 相信很多童鞋都笑而不语,这叫晚啊?在这个时候都是会觉得还特别早,说不定还有很多童鞋在加班赶项目呢,但大家还是要提醒大家照顾好自己身体,注意好休息,所以暂时写这几个,以后在不断学习中还会写一些总结或者想法与大家交流,刚才说的几点由于我个人理解不透或者错误之处,请大家拍砖指正,在这凌晨的时候,跟大家说声“早安”!

 

 

 

 

posted @   刘付灵(Foolin)  阅读(2608)  评论(11编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架

邮箱:Foolin@126.Com QQ:970026999

点击右上角即可分享
微信分享提示