作者:马宁

相信未来一段的业余时间,我都要和XNA为伍了。本来想向3D开发的纵深发展,但是遇到了一个实际的问题,就是如何在XNA下显示MessageBox和Software Input Panel。干脆先写出来吧,省得大家遇到这问题时抓狂。

按照为数不多的公开文档描述,XNA和Silverlight for Windows Phone应该是基于同一个.NET Compact Framework的CLR。但是,XNA并没有提供任何用户控件、MessageBox和软键盘等,也不能直接调用Silverlight for Windows Phone的类库。这样势必为XNA制造了很多人为的障碍。但调用MessageBox和Software Input Panel的后门,XNA还是给我们留下了,这就是Microsoft.Xna.Framework.GamerServices命名空间下的Guide类,类描述如下:

http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.gamerservices.guide.aspx

该类不但可以调用MessageBox和软键盘,还能够调用Marketplace、XBox Live等窗体。不过,值得注意的是,Guide类提供的方法都是异步调用,而非同步调用,这也好理解,游戏的处理过程是以时间驱动的,所以任何操作不应该阻塞住游戏主线程。

Guide类调用MessageBox和软键盘的描述在这里:

http://msdn.microsoft.com/en-us/library/ff827869.aspx

http://msdn.microsoft.com/en-us/library/ff827868.aspx

但MSDN文档还是有一些瑕疵,按上面提供的方法会产生Exception,所以我在下面给出修改后可以运行的方法。运行环境基于VS 2010 + Windows Phone 7 SDK RTW版。

调用MessageBox

创建Windows Phone 7中XNA 4.0的工程,然后,我们在Update方法里添加对于MessageBox的调用。当然,大家请不要认为把MessageBox加到Update里正确的,这样会造成MessageBox不断弹出。我只是为了简化代码,才这么做的。

        protected override void Update(GameTime gameTime){// Allows the game to exitif (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)this.Exit();// TODO: Add your update logic hereList<string> MBOPTIONS = new List<string>(); MBOPTIONS.Add("OK");MBOPTIONS.Add("CANCEL");if (!Guide.IsVisible)Guide.BeginShowMessageBox("test", "hello, XNA", MBOPTIONS, 0, MessageBoxIcon.Alert, new AsyncCallback(RespCallback), null);base.Update(gameTime);}

由于Microsoft.Xna.Framework.GamerServices是默认添加的组件,所以,我们可以直接使用Guide类。首先创建一个string类型的List,用于保存MessageBox中按钮的Text;然后通过List<string>的Add方法将需要显示的Button Text添加进去。

接下来是Guide.IsVisible方法,由于MessageBox、SIP软键盘等公用一个绘制表面,必须保证没有其他UI显示时,才能够显示指定组件,如果不添加这句Guide.IsVisible的判断,将触发下面的异常。

接下来就是调用的主体Guide.BeginShowMessageBox了,这是一个异步方法,调用后立刻返回。参数比较好理解,下面是函数的声明:

public static IAsyncResult BeginShowMessageBox (string title,string text,IEnumerable<string> buttons,int focusButton,MessageBoxIcon icon,AsyncCallback callback,Object state
)

第一个参数是标题,第二个参数是对话框内容,第三个是button上文字的列表,也表示有几个Button出现,第四个是焦点在第几个Button上,第五个是图标,我们设置为null,第六个是结束时调用的Callback函数对象,最后一个是用户自定义状态对象,可以传递自定义信息。其他参数都容易理解,AsyncCallback对象需要一个Callback函数RespCallback,我们实现如下:

        private static void RespCallback(IAsyncResult asynchronousResult){int? b = Guide.EndShowMessageBox(asynchronousResult);if (b > 0)Debug.WriteLine("Cancel");elseDebug.WriteLine("OK");}

Callback函数中最重要的工作是调用Guide.EndShowMessageBox函数,来关闭MessageBox。EndShowMessageBox需要传入一个IAsyncResult对象,来自Callback函数的参数。返回值是一个可为空的int,如果为空则表示没有返回值,如果不为空,返回值是Button的Index值,返回0表示点击了第一个按钮OK,返回1则表示点击了第二个按钮Cancel,以此类推。

显示MessageBox的效果如下:

调用Software Input Panel

接下来是调用SIP软键盘的代码,仍旧放到Update方法里,Callback函数也一并给出。

        protected override void Update(GameTime gameTime){// Allows the game to exitif (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)this.Exit();if (!Guide.IsVisible)Guide.BeginShowKeyboardInput(PlayerIndex.One,"Here's your Keyboard", "Type something...","abc",new AsyncCallback(GetTypedChars),null);base.Update(gameTime);}private static void GetTypedChars(IAsyncResult asynchronousResult){string output = Guide.EndShowKeyboardInput(asynchronousResult);Debug.WriteLine(output);}

前边都解释过了,直接来看Guide.BeginShowKeyboardInput,第一个参数要传PlayerIndex进去,这个是针对Xbox的,在Windows和Windows Phone 7上只支持一个用户,所以直接传PlayerIndex.One就好了。接下来的三个参数是标题、描述和默认字符,然后是异步调用方法和自定义状态。还有最后一个可选参数,表示是否用Password方式显示字符。

public static IAsyncResult BeginShowKeyboardInput (PlayerIndex player,string title,string description,string defaultText,AsyncCallback callback,Object state,bool usePasswordMode
)

在异步调用方法中,Guide.EndShowKeyboardInput会返回一个字符串,该字符串为用户输入的字符串。为什么显示的是字符串呢,这和SIP的显示方式有关。在调用SIP函数后,会首先弹出第一个对话框,询问用户是否输入字符,如果用户点Cancel则关闭SIP,如果点OK则进入第二个界面,用户才能够使用SIP软键盘进行输入。

下面就是SIP显示的状态:

写到最后

今天的主角Guide类,还有很多有趣的函数调用,有兴趣的朋友按照这个方法调用就可以了。这次的代码量不多,所以就不给出单独Sample Code的下载了。再有就是,虚心接受批评,将文章里代码的格式弄好了。

我最近还是很勤快的,Windows Phone 7的开发都写了三篇了,这是之前文章的链接:

马宁的Windows Phone 7开发教程(1)——Windows Phone开发工具初体验

马宁的Windows Phone 7开发教程(2)——Windows Phone XNA 4.0 3D游戏开发

本文转自马宁博客园博客,原文链接:http://www.cnblogs.com/aawolf/archive/2010/09/20/1831848.html,如需转载请自行联系原作者

马宁的Windows Phone 7开发教程(3)——XNA下使用MessageBox和软键盘相关推荐

  1. 马宁的Windows Phone 7.1初体验——XNA与Silverlight集成

    关于Windows Phone Mango真真假假的图片.视频已经在网上流传很久了,微软发布的Windows Phone 7.1 SDK可以让我们看到一部分Mango支持的功能. 普通用户对Mango ...

  2. MAC上搭建Windows Phone 8 开发环境——VMware Fusion下Win8 “无法安装Hyper-V, 某个虚拟机监控程序正在运行”问题解决的办法

    最近在试着在mac os上搭建Windows Phone 8的开发调试环境,使用的是VMware Fusion + Win8.1的虚拟环境. 点开VS2013, new 了一个helloWorld, ...

  3. windows 10 php安装教程,win10系统下wnmp的安装教程介绍

    本篇文章给大家带来的内容是关于win10系统下wnmp的安装教程介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 刚刚开始学习PHP时,一直使用phpstudy,后面发现很多东西自 ...

  4. WP7平衡球游戏开发教程--初识XNA Faeseer Magic

    小时候,我就想要自己做游戏,今天的技术已经发展得如此便利,我们可以很容易地创建简单的游戏.本文试图建立一个可重用的基于组件的游戏框架,减少了我们建立基于物理引擎的XNA游戏所需的时间. 我认为我们应该 ...

  5. Windows Phone 中文文章教程目录

    目录1(排名不分先后) 1 <Windows Phone 7 开发 31 日谈> 金山崟霸,张崟 (博客) 2 <Windows Phone 7 开发探索笔记> 金山崟霸,张崟 ...

  6. Windows8 游戏开发教程-开篇

    准备开始写一个win8游戏开发教程了,现在这里整理一下思路. 需要在开篇解释的问题就有一大堆了,先尝试一个个把他们写下来. 1.阅读这个教程需要什么样的基础? 2.这个教程能带来一个怎样的DEMO,结 ...

  7. 安卓输入法弹出后css横屏,mui开发安卓端,输入法软键盘导致css横屏样式判断触发...

    mui开发安卓端,输入法软键盘导致css横屏样式判断触发 mui开发安卓端,输入法软键盘导致css横屏样式判断触发 css 横屏媒体查询 @media screen and (orientation: ...

  8. Windows文件系统过滤驱动开发教程(0,1,2)

    0. 作者,楚狂人自述 我长期网上为各位项目经理充当"技术实现者"的角色.我感觉Windows文件系统驱动的开发能找到的资料比较少.为了让技术经验不至于遗忘和引起大家交流的兴趣我以 ...

  9. Windows文件系统过滤驱动开发教程(4)

    Windows文件系统过滤驱动开发教程 4.设备栈,过滤,文件系统的感知 前边都在介绍文件系统驱动的结构,却还没讲到我们的过滤驱动如何能捕获所有发给文件系统驱动的irp,让我们自己来处理?前面已经解释 ...

最新文章

  1. 困扰人工智能50多年的常识问题,是否迎来“破局”?
  2. MyBatis中使用YEAR和MONTH方法获取时间查询参数的年和月
  3. asp.net 根据当前时间计算是否股票、期货、黄金交易日期
  4. python批量音频转格式_GitHub - shede333/SWConvertVideoToAudio: Python批量转换 视频 为 音频MP3(即提取音频文件)...
  5. ES6学习笔记一(var let const三者区别)
  6. 计算机拨珠游戏,拨算盘与算盘游戏 | 褚半农
  7. SNMP协议-SNMP TRAP
  8. 信息学奥赛一本通pdf_信息学奥赛冠军的竞赛“秘籍”
  9. 扬州大学matlab课程设计报告,自动控制原理课程设计报告
  10. codeblocks安装教程和文件的简单创建方法
  11. Linux-v10.0
  12. 联想笔记本键盘排线_联想笔记本排线
  13. 学计算机科学与技术的考研方向,计算机科学与技术考研方向?
  14. android 拍照 对焦,Android Camera2 拍照(四)——对焦模式
  15. inkscape推荐插件安装
  16. 使用Flurry来统计和分析用户行为
  17. 为什么 128 KB 的魂斗罗可以塞下这么长的剧情?
  18. python绿色蓝色代表什么_蓝绿黄车牌识别(Python)
  19. 寒冬中,这些行业正在爆发
  20. 【转】linux shell 正则表达式(BREs,EREs,PREs)差异比较

热门文章

  1. Effective Java读书笔记七:泛型(部分章节需要重读)
  2. TCP/UDP,SOCKET,HTTP,FTP协议简析
  3. Visio中插入mathtype公式,解决直线交叉弯曲的问题
  4. C++实用技巧(一)
  5. C++11(及现代C++风格)和快速迭代式开发
  6. Day 30: Play Framework —— Java开发者的梦想框架
  7. Matlab之if-else-end分枝语句
  8. 《大话数据结构》简体中文版勘误
  9. MyBatis小问题(1)-Mapper中错误No constructor found...
  10. Spring核心(ioc控制反转)