马宁的Windows Phone 7开发教程(3)——XNA下使用MessageBox和软键盘
作者:馬寧
相信未來一段的業余時間,我都要和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和软键盘的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [译]HTMLCSS Lesson2:
- 下一篇: 《转载》Tomcat内存设置详解