Windows Phone 7 开发常见问题汇总

    开发Windows Phone应用程序需要安装哪些组件?

2.      Windows Phone开发的学习资源有哪些?

3.      我要去哪里提出对Windows Phone开发平台的建议?

4.      Windows Phone主要有哪些通信方式?

5.      Windows Phone访问REST service支持哪些验证方式?

6.      我能否启动一个后台进程?

7.      怎样在Windows Phone不同页面间传值?

8.      Windows Phone提供了哪些类型的推送通知服务?

9.      我能否开发一个系统组件?

10.         如何在Windows Phone模拟器中模拟多点触摸?

11.         在程序运行时怎样防止WP7自动锁屏?

12.         如何设置手机的横竖显示方向?

13.         如何隐藏System Tray?

14.         OnNavigatedTo和OnNavigatedFrom的区别是什么?

15.         如何动态修改 shell:ApplicationBarIconButton显示图片?

16.         如何使应用在手机锁定状态仍可以运行和震动?

17.         如何使手机震动? 如何使在震动的手机停止震动?

18.         如何使用WP7的收音机?

19.         如何使用CameraCaptureTask进行图像获取?

20.         XNA中如何弹出带有按钮处理事件的消息?

21.         手势有哪些基本操作(XNA)?

22.         XNA支持哪些手势?

23.         出现Invalid attribute value controls:LongListSelector for property TargetType这个错误的可能原因是什么?

Answers:

1.       开发Windows Phone应用程序需要安装哪些组件?

您只要安装Windows Phone SDK 7.1就已经包含最基本的windows phone开发所需工具:

·         Microsoft Visual Studio 2010 Express for Windows Phone

·         Windows Phone Emulator

·         Windows Phone SDK 7.1 Assemblies

·         Silverlight 4 SDK and DRT

·         Windows Phone SDK 7.1 Extensions for XNA Game Studio 4.0

·         Microsoft Expression Blend SDK for Windows Phone 7

·         Microsoft Expression Blend SDK for Windows Phone OS 7.1

·         WCF Data Services Client for Window Phone

·         Microsoft Advertising SDK for Windows Phone

可以选择性安装 Silverlight for Windows Phone Toolkit,其中提供了很多可直接使用的windows phone控件。

如果想要方便程序界面设计,推荐安装Expression Blend 4。


2.       Windows Phone开发的学习资源有哪些?

·         我们推荐你从portal开始:

http://msdn.microsoft.com/zh-cn/ff380145

http://create.msdn.com/en-US/

·         免费在线培训课程

WP7: http://msdn.microsoft.com/en-us/wp7trainingcourse.aspx

Mango: http://msdn.microsoft.com/en-US/WP7MangoTrainingCourse

·         MSDN文档

http://msdn.microsoft.com/zh-cn/library/ff402535.aspx  

·         开源代码实例

http://msdn.microsoft.com/zh-cn/library/ff431744.aspx

·         Programming Windows Phone 7免费电子书

http://blogs.msdn.com/b/microsoft_press/archive/2010/10/28/free-ebook-programming-windows-phone-7-by-charles-petzold.aspx

3.       我要去哪里提出对Windows Phone开发平台的建议?

如果您需要的一个功能在目前版本的Windows Phone不支持,可以去WPDev 反馈网站提交您的建议和意见。同时您也可以对已提交的建议进行投票,如果有足够多的人要求添加该功能,在未来的某个Windows Phone版本中就很可能实现了。

4.       Windows Phone主要有哪些通信方式?

Windows Phone支持传统的电话,短信,以及Email通信,但是你的程序无法直接控制电话短信,只能够通过PhoneCallTask,SmsComposeTask,以及EmailComposeTask间接通信。你可以使用这些task自动填充短信以及邮件内容,但无法强制用户发送短信和邮件,只有用户确认了才能发送。

Windows Phone也支持部分PC上的通信方式。

·         HTTP

可以使用WebClient或者HttpWebRequest访问REST service。

·         SOAP 1.1

可以访问支持SOAP 1.1的SOAP service,例如使用BasicHttpBinding的WCF service。请注意大多数手机,例如iPhone和Android,都不支持SOAP(虽然有第三方类库),所以我们推荐尽量使用REST。

·         REST

与服务器通信我们推荐使用REST service,而不是短信和邮件,因为REST service最通用,你可以在非手机设备上(例如今后会出现支持Windows 8的平板电脑)使用同样的service。你的service可以部署在任何服务器上,只需要该服务器能在internet上访问。例如,你可以将服务部署在Windows Azure云端。

·         Socket

WP7.1提供了部分socket的支持,有关详细信息请参考Windows Phone Socket 。

Socket适合于对性能要求高的场合,因为TCP相比较HTTP快一些。

5.       Windows Phone访问REST service支持哪些验证方式?

Windows Phone支持Basic Authentication和OAuth两种验证方式。

·         Basic Authentication

在简单的场合下,你可以使用basic authentication。请注意使用SSL加密通信。使用Basic Authentication的方式和普通的Silverlight程序是一样的,请参考

Windows Phone 7: Basic Authentication over HTTPS。

·         OAuth

使用OAuth可以使你的服务被第三方客户端访问,例如Windows Live Connect,Windows Azure ACS,Facebook,Google API,都支持OAuth。使用OAuth的方法,请参考

OAuth2 and OData Service in a Windows Phone 7 app 。

6.       我能否启动一个后台进程?

Windows Phone强调用户体验,强调电池使用效率,因此不支持后台进程。但是考虑到很多程序确实需要在后台做一些事,在WP7.1中提供了后台代理的功能。

使用后台代理,你可以要求系统在你的程序不处于运行状态时执行某些任务,但是系统不保证任务的优先级,若是多个程序都申请要执行后台任务,有可能你的任务必须等到其它程序申请的某个任务完成后才能执行。

7.       怎样在Windows Phone不同页面间传值?

Windows Phone页面间传值主要有三种方式:

·         Query String

例如URL定为/SecondPage.xaml?id=1,然后在SecondPage中通过NavigationContext.QueryString[“id”]取得对应的值。如果有多个属性,也可以通过&符号连接多个属性。如:/SecondPage.xaml?Name=MyName&Amount=100。注意所有的query string必须是string,如果是int之类的数值必须作类型转换,不能使用复杂类型。

·         全局变量

一个常见的做法是在App中定义一个属性,例如MyVariable。然后你可以通过(Application.Current as App).MyVariable的方式访问那个属性,读写均可。

·         在当前页面中定义一个属性,在SecondPage中重写OnNavigatedFrom,然后判断e.Content的类型是不是之前的那个页面,如果是,就做个类型转换,并访问对应的属性。例如假设从FirstPage转到SecondPage,可以在SecondPage的OnNavigatedFrom中写

    if (e.Content is FirstPage)

    {

        var v = (e.Content as FirstPage).SomeProperty;

    }



至于从page B返回参数给page A,和从page A传参数到page B是一样的,就是把A当成second page,把B当成first page即可。也可以使用query string,全局变量,或者在B中定义一个属性。

8.       Windows Phone提供了哪些类型的推送通知服务?

大体上分为三种 推送通知的方式,Raw、Toast和Tile。



·         Raw

推送一个二进制数据(在.NET平台上就是byte array)至手机。你的手机应用程序得到数据后,可以在应用程序内部进行处理并显示,但是不会涉及到任何tile和toast。



·         Tile

a.       Single tile:这是tile的一种,指的是单纯地操作应用程序的main tile。Service push一条消息至手机,这条消息可以包括一幅画,一句话,还有一个数。手机收到该消息后,如果用户有选择将对应的应用程序pin到主页上,就会更新应用程序的main tile。

b.      Multi tile:和single tile不同,它用于更新应用程序的secondary tile。你的程序可以提供一个功能,在主页上添加上不止一个tile。每个tile对应程序的一个页面。多个tile也可以对应同样的页面,使用query string区别表示。现在,service push消息时,会多包含一个URI信息,也就是对应的页面及查询字符串。当手机接收到该消息时,会比对每个secondary tile的URI,如果对应的页面和查询字符串都匹配,就会更新tile。



·         Toast

推送两句话至手机,分别代表主标题和副标题。手机收到消息后,会显示在屏幕上方,过一段时间自动消失。即使你的程序不在运行这两句话也会显示。如果用户触碰了那条消息,你的应用程序就会打开。



一种特殊的toast是Deep Toast,只是包含了一个URI和查询字符串。当用户触碰消息时,你的程序可以根据URI和查询字符串判断要打开哪个页面。



了解更多推送服务,请查看以下详细文档:

http://msdn.microsoft.com/en-us/WP7MangoTrainingCourse_PushNotificationsMangoLab

http://msdn.microsoft.com/zh-cn/library/ff402537(v=VS.92).aspx

9.       我能否开发一个系统组件?

目前Windows Phone不支持自行开发系统组件。只有微软和诸如诺基亚之类的OEM才有权限开发系统组件。但是你可以开发一个类库,并且被其它程序调用。这个类库可以包含普通的类,UserControl,以及自定义控件。其开发过程和普通的Silverlight类库是一样的。

如何在Silverlight中开发自定义控件,请参考

http://www.silverlightshow.net/items/Creating-a-Silverlight-Custom-Control-The-Basics.aspx。

开发Windows Phone自定义控件

http://www.windowsphonegeek.com/articles/Creating-a-WP7-Custom-Control-in-7-Steps。


10.       如何在Windows Phone模拟器中模拟多点触摸?


如果有支持多点触摸的显示器,则可以直接利用显示器进行多点触摸的测试。但如果没有支持多点触摸的显示器,我们可以通过安装Multi Touch Vista然后用两个鼠标来模拟多点触摸。 但是目前只在windows 7系统上支持。以下链接中介绍了详细的操作流程。

http://michaelsync.net/2010/04/06/step-by-step-tutorial-installing-multi-touch-simulator-for-silverlight-phone-7

11.       在程序运行时怎样防止WP7自动锁屏?

可以借助Guide.ScreenSaveEnabled 属性来防止系统检测手机空闲的状态。

UserIdleDetectionMode属性

Windows Phone 空闲检测

12.       如何设置手机的横竖显示方向?

在头部的<phone:PhoneApplicationPage>内有属性SupportedOrientations和Orientation。 SupportedOrientations为支持的显示方向。Orientation为当前的显示方向。他们的值都有三种选择:

·         Portrait:纵向。

·         Landscape:横向。

·         PortraitOrLandscape:纵向或横向。

13.       如何隐藏System Tray?

在头部的<phone:PhoneApplicationPage>内添加属性shell:SystemTray.IsVisible="False"即可隐藏System Tray。

14.       OnNavigatedTo和OnNavigatedFrom的区别是什么?

OnNavigatedTo是从其他页面跳转到当前页面时触发的事件,  OnNavigatedFrom是从当前页面跳转到其他页面时触发的事件,简单的理解 OnNavigatedTo”ThisPage”和 OnNavigatedFrom”ThisPage”。


15.       如何动态修改 shell:ApplicationBarIconButton显示图片?

IApplicationBarIconButton iconButton = this.ApplicationBar.Buttons[0] as IApplicationBarIconButton;
iconButton.IconUri = new Uri(“Images/icon.png”, UriKind.Relative);

16.       如何使应用在手机锁定状态仍可以运行和震动?

设置PhoneApplicationService.Current.ApplicationIdleDetectionMode = IdleDetectionMode. Enabled;

但是,这个设置是单向的,当设置为Disabled后,就不能再设置为Default.

17.       如何使手机震动? 如何使在震动的手机停止震动?

使手机震动:VibrateController.Default.Start(TimeSpan.FromSeconds(.5));

使在震动的手机停止震动: VibrateController.Default.Stop();

18.       如何使用WP7的收音机?

·         FMRadio.Instance.SignalStrength:获取信号强度.

·         FMRadio.Instance.Frequency:获取当前的频率.

·         FMRadio.Instance.PowerMode = RadioPowerMode.On;打开收音机.

·         FMRadio.Instance.PowerMode = RadioPowerMode.Off;关闭收音机.

19.       如何使用CameraCaptureTask进行图像获取?

请参见以下代码

private void button1_Click(object sender, RoutedEventArgs e)
{
    CameraCaptureTask camera = new CameraCaptureTask();
    camera.Completed += OnCameraCaptureTaskCompleted;
    camera.Show();
}

void OnCameraCaptureTaskCompleted(object sender, PhotoResult args)
{
    if (args.TaskResult == TaskResult.OK)
    {
        BitmapImage bmp = new BitmapImage();
        bmp.SetSource(args.ChosenPhoto);
        img.Source = bmp;
    }
}


20.       XNA中如何弹出带有按钮处理事件的消息?

1.       添加Microsoft.Xna.Framework.GamerServices的引用

应用以下代码:

    Guide.BeginShowMessageBox("标题","我是消息,我被弹出来了!",new string[] { "是", "否" }, 0, MessageBoxIcon.None, new AsyncCallback(OnMessageBoxClosed), null);

        void OnMessageBoxClosed(IAsyncResult result)
    {
          int? buttonIndex = Guide.EndShowMessageBox(result);
          if (buttonIndex == 1)
          {
              //执行当”是”按钮被按下时候的处理代码
          }
          else if(buttonIndex == 2)
          {
              //执行当” 否”按钮被按下时候的处理代码
          }
          else
          {
              //当后退按钮被按下时,需要处理的代码
          }
     }


21.       手势有哪些基本操作(XNA)?

·         获取手势并处理:

while (TouchPanel.IsGestureAvailable)
{
    GestureSample gestureSample = TouchPanel.ReadGesture();
    if (gestureSample.GestureType == GestureType.Tap)
    {
    }
}


·         获取上一时刻的TouchLocation:

TouchLocation previousTouchLocation;
bool success = touchLocation.TryGetPreviousLocation(out previousTouchLocation);


·         获取屏幕多点触摸的所有Touch:

TouchCollection touchLocations = TouchPanel.GetState();
foreach (TouchLocation touchLocation in touchLocations)
{
}


·         设置可用的手势:

TouchPanel.EnabledGestures = GestureType.Tap;

22.       XNA支持哪些手势?

·         Tap:手指单击

·         DoubleTap:手指双击

·         Hold:手指碰触并固定一段时间

·         FreeDrag:自由移动手指

·         VerticalDrag:上下移动手指

·         HorizontalDrag:左右移动手指

·         DragComplete:移动结束

·         Flick:滑过(手指抬起时不停止)

·         Pinch:缩小和延伸

·         PinchComplete:缩小和延伸结束

23.       出现Invalid attribute value controls:LongListSelector for property TargetType这个错误的可能原因是什么?

出现这个错误的原因可能是,你所创建的项目的版本与所使用的SDK版本不符合。

解决方案:

·         如果你创建的是一个7.0的项目,需要安装Silverlight for Windows Phone Toolkit - Feb 2011。

·         如果你想使用最新版本的windows phone toolkit,请将项目升级为7.1版的(右击项目,选择Upgrade to Windows Phone 7.1)

1.Windows Live注册地选成中国了怎么办?

登录网页Hotmail,然后右上角,你的用户名,单击,弹出下拉列表,点击账户
那里有个国家/地区,点击它后面的更改”……就可以重新选择地区了


2.关于3G选项的问题

部分WindowsPhone手机 是默认没有打开3G选项的,这个需要我们自己来打开。但是前提是你的系统版本是8107之前的(因为8107的注册表安全性更高了,很多以前可以修改的在8107上都不能修改了)


3.通过修改注册表来修改绑定的Live ID。(三星上实验成功)

安装WP7RootTools0.8.xap,然后进入该软件,按照下面路径打开相关文件,直接修改就可以了(8107版本的系统同样有效)
[HKEY_CURRENT_USER\Software\Microsoft\ActiveSync\Partners\{B2830118-7BC6-4A74-8C9A-3D8B9CEF88E0}]
"Email"=your_new_id@hotmail.com(新的LIVE ID账号)
"User"=your_new_id@hotmail.com(新的LIVE ID账号)

[HKEY_CURRENT_USER\Software\Microsoft\IdentityCRL\Environment\Production]
"DefaultID"=your_new_id@hotmail.com(新的LIVE ID账号)


4.关于sd卡导致的问题

首先,WindowsPhone系统的手机目前不支持拔插sd卡,也就是说,如果你要用sd卡扩容的话,插上卡,重置手机以后,最好就不要去动手机里的sd卡了。否则会出错导致无法开机


6.关于手机费流量的问题

Windows Phone手机主要是联系人跟邮件要经常同步,比较费流量(当然不排除还有其他原因,在这里只是点出一些问题,给建议),当你不上网时,把data connection(网络连接)关闭(“Settings(设置)”-->“cellular(移动电话)”-->“Data connection(数据连接)”)



7.关于连接wifi时,如何优先使用wifi

首先我声明,手机里没得设置优先使用wifi的,所以我建议,当你用wifi时,关掉data connection(数据连接)。



8.使用笔记本为wifi热点连接手机,并且使用无线让手机跟电脑同步

Windows 7系统下,开始”-->“附件”-->“命令提示符用右键管理员身份打开,然后输入
netsh wlan set hostednetwork mode=allow ssid=binglanPCkey=binglanWiFi
其中ssid就是帐号,而key就是密码。
然后,进入到网络和共享中心”-->“更改适配器设置,右键无线网络连接”-->“属性”-->“共享,把那个允许其他网络 用户通过此计算机的Internet连接来连接前面那个复选框打上勾,然后下面有个列表,选择你新建的那个网络接入点。
最后,再次右键打开管理员身份运行开始”-->“附件”-->“命令提示符,输入
netsh wlan start hostednetwork 回车,就ok了,这样,你的手机就可以连接到电脑的wifi上了。
(如果要暂时关掉电脑wifi的话,可以输入netsh wlan stop hostednetwork,或者重启电脑就ok了)
至于那个手机用WIFI跟电脑同步,首先,你必须先用数据线连接zune,然后打开zune的设置,转到无线同步,然后手机连接wifi,当你手机连上wifi时,那里有个设置无线同步的按钮可以点击,点下去就可以了,这样就可以不用数据线了
(如果你把密码忘记了的话,开始”-->“附件”-->“命令提示符用右键管理员身份打开,然后输入netsh wlan set hostednetwork mode=disallow。然后再重新弄一个wifi热点就可以了


10.如何卸载安装到“设置”里的程序:

步骤如同安装其他软件一般,但是在安装的过程中,时间要自己把握一下,然后在差不多安装到一半时,拔掉数据线,或者是关掉zune,只要结果它提示说安装出错,那么你安装到“设置”里的程序就被卸载了


12.如何安装软件:

首先,手机必须先越狱。然后已经安装了必须的软件(zune,.n et 4.0, sdk)。手机连接zune,打开安装工具,选择要安装的软件安装就行了。安装过程中,手机必须保持没有锁频的状态

zune下载地址:http://www.microsoft.com/downloads/zh-cn/details.aspx?FamilyID=3e868560-12d4-43b5-88d4-17b1f8e65e12
.n et4.0下载地址:http://www.microsoft.com/downloads/zh-cn/details.aspx?FamilyID=0A391ABD-25C1-4FC0-919F-B21F31AB88B7
sdk完整版下载地址:http://www.microsoft.com/downloads/zh-cn/details.aspx?FamilyID=0a373422-6680-46a7-89e1-e9a468a14259



13.打电话时,“一按拨号键就直接黑屏”的问题:

这个问题如果不是硬件问题的话,就主要是“距离感应器”的参数太小了,我们可以自己修改的。
打开拨号器,输入 ##634# 进入“工程模式”,然后在“工程模式”里,输入 *#0*#,进入到另外一个设置界面,找到最下方中间的那个“Proximity”,点击它进入。找张卡片,或者随便什么都行,挡在距离感应器之前,具体距离得自己把握,一般为35-37之间,然后点击 “SET”,手机重启。这样就OK了。


14.关于软件与游戏的安装目录问题(感觉这个有点跑题了)

推荐用好压。
1.首先,你把下载好的.xap软件用解压缩工具打开
2.找到一个名叫WMAppManifest.xml的文件,右键,“内部查看器打开”。
3.打开以后,在前几行中,搜索Genre="。。。"这代码,一般软件的话是Genre="apps.normal"游戏的话是Genre="apps.games",只要将 apps.normal 改成 apps.games,安装完成的软件就会在你的 XboxLive游戏区 里显示而不会在第二桌面!同样,修改 apps.games 为 apps.normal,游戏就不会显示到你的XboxLive里,而是显示在你的第二桌面那里。改完记得保存。。。


15
.关于手机IE主页问题

IE有记忆效应的,上次是在那个页面退出的这次进去就是上次退出的最后一个页面,如果不想每次都自动刷页面的话,那么在退出前,打开索引标签(就是下面工具栏的第一个选项),删之,下次进去,就是空白页了


16.关于闹钟问题

winphone7手机不支持关机闹钟,所以如果使用其他系统的手机时一般晚上睡觉时都是关机的,而早上起床需要用到手机闹钟的话,在使用winphone7手机时,我只能建议你晚上开启飞行模式了。


17.不开zune也能安装软件

当你没有无线路由,并且用的是台式机时,当你想通过市场安装软件时。没有WiFi是一件很痛苦的事情,但是现在我们不需另外安装任何软件,就能让手机使用电脑网络,且能直接使用手机市场。
前提:你安装了完整版的SDK
步骤:
  1、将手机用USB线连接电脑;
  2、关闭zune;
  3、运行 C:\Program Files\Microsoft SDKs\Windows Phone\v7.1\Tools\WPConnect\x86 目录下 WPConnect.exe (Win7 64位系统类推)
  4、好了,看看能不能用手机上市场了。(不放心的话可以先关掉手机网络连接)
令:XP系统下,请使用该程序:


18.接入点APN设置:

一般,只要插入SIM卡并且打开数据连接就可以联网了,但是也有一些例外,比如说偶尔会有联通卡2G卡升级为3G卡以后就无法上网了,这个时候打电话过去10010人工服务,让他帮你重刷一下GPRS(应该是GRPS,如果不知道是什么的话,就直接跟他反应说转卡以后无法上网了),他会让你设置接入点的APN。一下简单介绍一些APN的设置:
3G/GPRS设置:
A.移动2G:Settings(设置)>Mobile network(手机网络)>Add apn(添加接入点)>APN内填写cmnet(如果开通cmwap就可以使用cmwap)
B.联通2G:Settings(设置)>Mobile network(手机网络)>Add apn(添加接入点)>APN内填写uniwap
C.联通3G:Settings(设置)>Mobile network(手机网络)>Add apn(添加接入点)>APN内填写3gnet(少数县级城市可能得填3gwap)
原文地址:https://www.cnblogs.com/fx2008/p/2456564.html