jiangyongtao

Windows Phone 世外涛缘
posts - 8, comments - 55, trackbacks - 0, articles - 0

2011年1月24日

      在Windows Phone 7中如何获取用户信息和设备信息呢?只需要使用Microsoft.Phone.Info命名空间下的UserExtendedProperties类和DeviceExtendedProperties类对应的成员函数就可以了。具体怎样操作?请看正文。

获取用户信息

      使用UserExtendedProperties类的GetValueTryGetValue方法即可。目前这两个函数的入参,都只支持“ANID”。

      GetValue用法如下:

string anid = UserExtendedProperties.GetValue("ANID") as string;
string anonymousUserId = anid.Substring(2, 32);

      TryGetValue用法如下:

    object anid = new object();
    string anonymousUserId = "";
    if (UserExtendedProperties.TryGetValue("ANID", out anid))
    {
      anonymousUserId = anid as string;
      anonymousUserId = anonymousUserId.Substring(2, 32);
    }

      需要注意的是,如果你的WP7手机没有绑定Live ID,GetValue返回的字符串为null,TryGetValue返回的对象也为null。因此在项目中要注意对返回字符串和对象的非空判断。

获取设备信息

      与获取用户信息相似,使用DeviceExtendedProperties类的GetValueTryGetValue方法,这两个方法的使用方式也与上面相同,不同的是入参。Windows Phone 7可以获取的设备信息如下:

属性名称 值类型 描述 补充说明

DeviceManufacturer

字符串
(最大长度256)
设备的生产厂商。该字符串没有标准格式。微软建议同一个厂商生产的手机使用相同的字符串,但这不是强制的。 注意,该值也可能为空
DeviceName 字符串
(最大长度256)
设备名称。该字符串没有标准格式。 注意,该值也可能为空

DeviceUniqueId

长度为20的byte数组 设备的唯一标识。该值是唯一不变的,即使系统升级。 注意,不要使用该值来标识用户,因为用户可能可以更换手机,同一手机也有可能被不同用户使用
DeviceFirmwareVersion 一个字符串 当前设备运行的固件版本。如果安装了新版本的固件,该值将会增长。 注意,该值也可能为空

DeviceHardwareVersion

一个字符串 当前设备的硬件版本。 注意,该值也可能为空

DeviceTotalMemory

长整型 设备物理内存的大小(单位是Byte) 该值通常小于实际的RAM大小略小,因此可以用它来判断RAM是否够用。

ApplicationCurrentMemoryUsage

长整型 当前应用程序使用的内存(单位是Byte) 可以用它来观察当前应用程序消耗内存的情况

ApplicationPeakMemoryUsage

长整型 当前应用程序使用内存的峰值(单位是Byte) 可以用它来观察当前应用程序内存最大使用的情况

先来看看获取设备厂商的方法:

string strDeviceManufacturer = DeviceExtendedProperties.GetValue("DeviceManufacturer").ToString();

 

其它的设备信息获取都与设备厂商一样,把GetValue或TryGetValue的参数换一下就可以了。

有一个有点不同,就是DeviceUniqueID。有时候我们就需要保存一个字符串来标识设别的唯一性就好了,用Byte数组有点麻烦,我在这里遍历了该数组,把它转为了一个长度为60的字符串,代码如下:

    byte[] byteArray = DeviceExtendedProperties.GetValue("DeviceUniqueId") as byte[];
    string strTemp = "";
    string strDeviceUniqueID = "";
    foreach (byte b in byteArray)
    {
      strTemp = b.ToString();
      if (1 == strTemp.Length)
      {
        strTemp = "00" + strTemp;
      }
      else if (2 == strTemp.Length)
      {
        strTemp = "0" + strTemp;
      }
      strDeviceUniqueID += strTemp;
    }

 

我在Demo中的界面只放置了几个获取设备信息的Button和TextBlock,很多都一样,就没有都列出来,截个图供大家参考吧:

image

上图是我在模拟器上运行的结果,无法绑定LiveID,所以用户信息一项取不到,为空。其它都正常。

我在真机上测试都可以取到相关信息。:)

为了方便大家使用,我把获取用户和设备信息的代码封装到了一个类中,都是Public的静态方法,直接就可以用了。

下载Demo

如果发现什么问题,请各位及时通知我,谢谢。

posted @ 2011-01-24 22:22 世外涛缘 阅读(1760) 评论(6) 编辑

2011年1月5日

今天有朋友问我怎么在Button点击的时候修改它的前景色和背景色,自己觉得这个问题挺简单的,就写了两行代码,放到了按钮的点击事件响应行数中,代码如下:

private void button1_Click(object sender, RoutedEventArgs e)
{
    button1.Background = new SolidColorBrush(Colors.Blue);
    button1.Foreground = new SolidColorBrush(Colors.Red);
}

界面截个图,直观些:

image

编译执行后,按钮的颜色没有变化,感觉非常奇怪。于是查看MSDN的帮助文档,把控件更新相关的方法也胡乱试了一通,居然都没有效果。郁闷了,觉得奇怪,把代码直接复制到构造函数的下面了:

public MainPage()
{
    InitializeComponent();
    button1.Background = new SolidColorBrush(Colors.Blue);
    button1.Foreground = new SolidColorBrush(Colors.Red);
}

补充一句,默认情况下Button是黑色背景,白色前景。

编译执行后,按钮颜色变了!这说明在代码中操作Background和Foreground这两个属性也没问题啊。

想不通了,我再加个按钮试试吧,于是又增加个button2,在button2的点击操作中做同样的操作,也是改变button1的前景色和背景色。

问题出现了:

1.如果先点击Button1,还是没有任何变化,再点击Button2,Button1也没有变化

2.如果先点击Button2,Button1的前景色和背景色就变了

3.我又试了Button2点击响应函数中改变自己颜色,没有效果

截图如下:

image

 

我有点晕了,为什么呢?不过似乎找到了点规律,就是按钮在其自身的点击响应函数中,修改不了自身的前景色和背景色。

没想明白,再增加一个按钮试试吧。这回策略变一下,在每个按钮的响应函数中,修改另外两个按钮的颜色。

又找到了规律:

1.第一次点击某一个按钮,例如Button1,修改另外两个按钮的前景色和背景色,都正常能修改。如图:

image

2.第二次点击另一个按钮,例如Button2,第一次点击过的按钮颜色不会变。如图:

image

3.只要点击过的按钮,颜色就无法改变了。

我想不明白了,为什么只要点击过的按钮,颜色就修改不了了呢?

我又用Silverlight程序试了一下,在SL中没这个问题,只有在WP7中这个问题存在。

如果真的有这样的需求,给大家几个建议:

1.用Blend编辑好按钮各个状态的颜色,例如按下和正常状态的颜色,不在代码里动态改变了。

2.把按钮设置为透明,后面放个Border,这样做能改背景色,但前景色就无能为力了。

3.用Image或其它控件代替Button,这样可能会麻烦一些。

如果大家有好的解决办法,请在下面留言,非常感谢。

特别感谢:MagicBoy110同学跟我讨论并验证该问题。

 

示例源代码

posted @ 2011-01-05 21:39 世外涛缘 阅读(2205) 评论(11) 编辑

2010年11月24日

本文简单介绍Pivot(枢轴视图)控件,通过本文的介绍可以对Pivot的使用和效果有个初步的认识。

概述

枢轴(Pivot)控件提供了一种快捷的方式来管理应用中的视图或页面。枢轴视图可以用来过滤数据,将视图分类。枢轴视图控件水平放置独立的视图,同时处理左侧和右侧的导航,可以通过划动或者平移手势来切换枢轴控件中的视图。Pivot默认就支持了手势,不需要我们做任何工作。

它的外观如下图所示:

image

该图展示了一个有三个页面的枢轴视图,可以通过划动和平移手势切换页面,向左划动,就由当前页面(例如Item1)切换到下一个页面(Item2),如果切换到最后一个页面,同样操作会回到第一个页面,也就是说,枢轴视图的页面是循环的。另外也可以点击Item的标题来切换,在Item1中,点击其后面并列的灰色的item2或item3(它只显示了一部分),就可以切换到相应页面。

页面结构

image

上图红色区域就是Pivot Control。

Pivot分为两个部分:

上图黄色区域是Pivot的Header部分和绿色区域是PivotItem的Content部分。

Header:主要包含Pivot的Title,在图中为“PIVOT APPLICATION”,还有PivotItem的Header,在图中为“item1、item2和item3”。

可以设置Pivot的Title属性,改变文字;可以编辑TitleTemplate,来改变Title的样式,比如在Title加个小图标等等,但是建议不要改变它的高度,我会在之后的文章中来详细说明。

PivotItem的Header属性与Pivot的Title属性类似,可以设置它改变文字,但PivotItem没有提供Header的模板属性,因此目前不能改变它的外观。Header属性的文字不要设置太长,否则会导致其它PivotItem的Header无法显示出来。

PivotItem:显示在枢轴视图页面的控件都放到PivotItem中,可以把PivotItem当作一个容器控件,将要展示的控件都放置在其中。

 

Pivot的重要属性和事件

属性

SelectedIndex:获取或设置当前选择的PivotItem的索引。

SelectedItem:获取或设置当前选择的PivotItem的对象。

Title:获取或设置Pivot的标题。

TitleTemplate:获取或设置Pivot标题的模板,通过设置它可以改变Pivot标题的外观。

事件:利用好这些事件被触发的时机,可以有效的实现数据的动态加载。

LoadedPivotItem:该事件在加载完成后被触发。

LoadingPivotItem:该事件在加载PivotItem时被触发,可以用来动态加载数据。

SelectionChanged:选择的PivotItem改变时该事件被触发。

UnloadedPivotItem:该事件在卸载PivotItem完成时被触发。

UnloadingPivotItem:该事件在卸载PivotItem开始时被触发。

 

使用建议

从性能方面考虑,尽量少用Pivot,使Pivot的PivotItem尽可能的少。

为了提高Pivot的启动速度,可以延迟加载一些数据。在初始化时只加载必要的数据,切换到相应的PivotItem时,再动态加载需要的数据。

确保Pivot只是用来显示同类的页面或数据,而不是因为喜欢它的展示效果就将很多不相关的数据和页面放到一个Pivot当中。

空的PivotItem一定要删除。

千万不要用Pivot来展示业务流程,就是说Pivot中的页面必须为并列关系,不能为相互依赖的关系。

在PivotItem中,不要使用具有水平Pan和Flick的手势的控件(例如水平的ScrollViewer或ListBox),因为这类控件会拦截手势的消息,阻碍Pivot页面的切换。

PivotItem中的控件宽度,不要超过一个屏幕,超出部分将无法显示。(注意:Panorama可不是这样)

可以编程实现切换到哪个PivotItem,设置Pivot的SelectedIndexSelectedItem属性就可以。

 

对Pivot(枢轴视图)控件介绍就到这里,也没什么代码和Demo,看着一定不爽,我会抓紧写一篇《Pivot(枢轴视图)控件开发初体验》,主要从实际编码角度来介绍,请关注吧。

posted @ 2010-11-24 23:09 世外涛缘 阅读(2065) 评论(13) 编辑

2010年11月22日

摘要: 本文简单介绍Panorama(全景视图)控件,通过本文的介绍可以对Panorama的使用和效果有个初步的认识。阅读全文

posted @ 2010-11-22 23:13 世外涛缘 阅读(2102) 评论(5) 编辑

2010年10月19日

本文将Windows Phone 7常用的资源进行了整理,方便大家使用。

后续我将会经常更新其中的资源,大家如果有好的资源请留言,我好编辑到本文中。

1.工具下载

在线安装包

离线安装包(推荐)

开发工具包更新(2010.10)

2.微软官方资料

Windows Phone 7中文开发中心

MSDN Windows Phone首页

微软Windows Phone Portal

微软Windows Phone Home

Windows Phone Newsroom

Windows Phoen团队博客

Silverlight for Windows Phone

Expression Blend 4 for Windows Phone

Windows Phone开发者网站

MSDN在线帮助文档

Windows Phone 7 开发者训练包

Windows Phone 7 开发者训练包(中文版)

示例代码

Windows Phone 7 Jump Start视频教程(英文)

Inside Windows Phone视频教程(英文)

Microsoft Silverlight 4 脱机文档(简体中文)

Microsoft Silverlight 4 在线帮助文档(MSDN)(简体中文)

3.论坛

MSDN Windows Phone 7论坛(英文)

MSDN Windows 移动设备论坛(中文)

CSDN Windows Mobile论坛

WPMind论坛

4.WP7常用站点

WPMind

WP7爱好者

!fanr Live

智机网

Codeplex Windows Phone 7

Windows Phone 7 - CodeProject



posted @ 2010-10-19 21:35 世外涛缘 阅读(3357) 评论(17) 编辑

2010年10月17日

摘要: 本文简单介绍Launchers和Choosers的概念,以及它们的区别,简述各个Launcher和Chooser的功能,并分析它们的行为。Launchers和Choosers是为了统一调用系统提供的服务(程序),让每个第三方应用程序调用相同系统功能时,保持界面的一致性。Launchers启动器:启动Windows Phone 7内置应用程序。包括以下几个:EmailComposeTask:启动发送...阅读全文

posted @ 2010-10-17 10:35 世外涛缘 阅读(1527) 评论(2) 编辑

2010年10月8日

摘要: 本文简单介绍Windows Phone 7的屏幕方向,以及屏幕方向变更时所做的处理。 Windows Phone 7的屏幕方向分为垂直方向和水平方向,但与之前Windows Mobile可以旋转4个角度不同,Windows Phone 7垂直方向只有一种方向。还是用图说的比较清楚:1.垂直方向:垂直方向不支持180度的旋转了,想想也是,没几个人习惯把手机倒着用。 2.水平方向: 水平方向需要注意一...阅读全文

posted @ 2010-10-08 22:47 世外涛缘 阅读(638) 评论(1) 编辑

2010年9月18日

摘要: 本文主要说明安装Windows Phone 7 Developer ToolsBeta版的用户在更新RTM版时遇到的问题,以及更新的主要内容。Windows Phone Developer Tools终于发布了,下载地址。等了好久,终于下载完成,开始安装。由于之前安装了Beta版,安装正式版时遇到了点小问题。提示错误信息如下: 原来需要将Beta版的相关文件删除,在 卸载程序 面板中找到:Micr...阅读全文

posted @ 2010-09-18 00:36 世外涛缘 阅读(958) 评论(0) 编辑