作者:馬寧
示例代碼下載地址:
寫這篇BLOG完全是因為看了MSDN上的這篇文章:
http://msdn.microsoft.com/en-us/magazine/ff960707.aspx
Windows Phone 7的開發工具不支持動態語言,所以IronRuby支持Windows Phone 7就顯得格外重要了。剛看這篇文章的時候,還鬧了個笑話,看了一遍代碼,一句都不認識,心想難道語言換到.NET上,變化怎么這么大?仔細一看,原來是Ruby,而不是Python ^_^,小蟒蛇這次落后了。以前用Python寫過自動化測試腳本,沒接觸過Ruby,所以,把Ruby看成Python了。
不支持動態語言,一直是Windows Mobile編程的痛,這次終于有搞頭了。終于可以動態改變程序的邏輯了,光這一點就給我們提供了無限的想象空間。Windows Phone上的F#也快了吧?^_^
言歸正傳,這次我完全是照葫蘆畫瓢,只是將自己嘗試中的一些關鍵點寫出來,讓大家少走彎路。更多信息大家可以參考Shay Friedman的BLOG: http://ironshay.com/
首先,我們要下載IronRuby for Windows Phone版本(.NET 3.5):
http://ironruby.codeplex.com/releases/view/43540#DownloadId=133276
然后,在Visual Studio 2010中創建一個Silverlight for Windows Phone 7的工程,工程名叫做“IronRubyWP7”,然后選擇“Project”菜單的“Add Reference”選項,在彈出的對話框中,選擇“Browse”標簽,我們可以找到解壓后的IronRuby目錄,將\silverlight\bin中的DLL文件加入到工程中來:
在忽略一些警告提示之后,程序集將被加入到工程中。我們可以在Solution Explorer中看到剛被加入的程序集:
接下來,我們在工程中添加一個文本文件,在Solution Explorer中選中IronRubyWP7,右鍵,“Add”-“New Item”,在對話框中選擇“Text File”,將文件名改為“MainPage.rb”。
選中MainPage.rb文件,在屬性中將“Build Action”設置為“Embedded Resource”。
我們打開MainPage.rb文件,輸入下面的Ruby代碼:
# Include namespaces for ease of use include System::Windows::Media include System::Windows::Controls # Set the titles Phone.find_name( "ApplicationTitle" ).text = "aawolf.cnblogs.com" Phone.find_name( "PageTitle" ).text = "IronRuby& WP7" # Create a new text block textBlock = TextBlock.new textBlock.text = "IronRuby is running on Windows Phone 7!" textBlock.foreground = SolidColorBrush.new(Colors.Green) textBlock.font_size = 48 textBlock.text_wrapping = System::Windows::TextWrapping.Wrap # Add the text block to the page Phone.find_name( "ContentPanel" ).children.add(textBlock)<style type="text/css"> .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }</style>
請注意,我修改了最后一行的容器控件名稱,原示例中的名稱是“ContentGrid”,但是Silverlight for Windows Phone向導默認創建的XAML文件中容器類名稱是“ContentPanel”。這里會引起一個運行期錯誤,因為IronRuby不能Debug,所以第一次調試起來比較痛苦。
接下來,我們要打開MainPage.xaml.cs文件,將IronRuby初始化代碼,加入到MainPage類的構造函數中:
public partial class MainPage : PhoneApplicationPage { // Constructor public MainPage() { InitializeComponent(); // Allow both portrait and landscape orientations SupportedOrientations = SupportedPageOrientation.PortraitOrLandscape; // Create an IronRuby engine and prevent compilation ScriptEngine engine = Ruby.CreateEngine(); // Load the System.Windows.Media assembly to the IronRuby context engine.Runtime.LoadAssembly( typeof (Color).Assembly); // Add a global constant named Phone, which will allow access to this class engine.Runtime.Globals.SetVariable( "Phone" , this ); // Read the IronRuby code Assembly execAssembly = Assembly.GetExecutingAssembly(); Stream codeFile = execAssembly.GetManifestResourceStream( "IronRubyWP7.MainPage.rb" ); string code = new StreamReader(codeFile).ReadToEnd(); // Execute the IronRuby code engine.Execute(code); } }<style type="text/css"> .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }</style>
請大家注意InitializeComponent方法的位置,在初始化IronRuby運行時之前,一定要先完成控件初始化的工作,這是我血和淚的教訓。另外一個需要注意的地方,就是讀取Ruby文件的路徑。我們似乎也可以通過HttpRequest獲取一個Stream是吧?笑而不語 ^_^
最后運行的效果是這樣子的,整個開發過程歷時兩小時:
相關資源
馬寧的Windows Phone 7開發教程(1)—— Windows Phone開發工具初體驗
馬寧的Windows Phone 7開發教程(2)—— Windows Phone XNA 4.0 3D游戲開發
馬寧的Windows Phone 7開發教程(3)—— XNA下使用MessageBox和軟鍵盤
馬寧的Windows Phone 7開發教程(4)—— XNA顯示中文字體
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
