zoukankan      html  css  js  c++  java
  • Windows Phone 7常用的开发技巧&学习总结

    现在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

  • 相关阅读:
    将10进制数字转成62进制数字(转)
    admin添加用户时报错:(1452, 'Cannot add or update a child row: a foreign key constraint fails (`mxonline`.`django_admin_l
    Django admin 中抛出 'WSGIRequest' object has no attribute 'user'的错误
    分布式爬虫
    Scrapy之CrawlSpider
    Scrapy之Cookie和代理
    Scrapy核心组件
    scrapy之持久化存储
    Scrapy框架的基本使用
    爬虫之request模块高级
  • 原文地址:https://www.cnblogs.com/622698abc/p/2779966.html
Copyright © 2011-2022 走看看