1. 程式人生 > 實用技巧 >Silverlight3學習筆記(2):Silverlight初接觸

Silverlight3學習筆記(2):Silverlight初接觸

在上一篇中講述瞭如何安裝適合自己需要的VS2010以及相關幫助文件,由於在VS2010中幫助文件的查詢方式不同於以往的VS,在上篇中還介紹了H3Viewer這個軟體,它是一個免費的軟體,安裝它之後可以在安裝了VS2010幫助文件之後以類似於以前檢視MSDN的方式檢視幫助文件。除此之外,在上一篇還比較了幾種常見的RIA技術,比如Java AppletFlashSilverlight,以及它們與普通Windows應用程式在執行機制上的區別和限制。在這一篇開始涉及到Silverlight了,這一篇主要是講Silverlight的開發工具VS2010以及XAML語言等知識。 建立Silverlight專案 當我們建立一個
Silverlight專案時會提示是否建立一個承載專案,如下圖所示: 由於在VS2010中已經直接支援建立ASP.NET MVC2Web專案,所以承載SilverlightWeb專案型別有三種:ASP.NET Web應用程式專案、ASP.NET 網站及ASP.NET MVC Web應用程式專案。ASP.NET Web應用程式專案可以提供與Visual Studio .NET 2003 Web 專案相同的 Web 專案語義,它的編譯模型與 Visual Studio .NET 2003 編譯模型類似。專案中的所有程式碼檔案(獨立檔案、程式碼隱藏檔案以及類檔案)將被編譯成單個程式集並存儲在 Bin 目錄中。由於編譯會建立單個程式集,因此可以指定程式集名稱和版本等屬性。如果我們僅僅是開發
Silverlight的話,這個可以隨便選擇一種型別,以便能在網頁中檢視Silverlight的執行效果。 VS2010介面 建立Silverlight專案成功之後可以看到如下的介面: VS2010中可以直接從工具箱中向Silverlight介面中拖控制元件。在開發ASP.NET時一個頁面會分為兩部分.aspx.cs.cs,前者包含了設計程式碼,後者則是包含業務邏輯程式碼,和ASP.NET開發一樣,Silverlight的專案中每個控制元件或者頁面也是分為.xaml.xaml.cs.xaml程式碼也是包含設計程式碼,.xaml.cs則是包含業務邏輯程式碼。在每個Silverlight專案中預設會有一個
app.xaml檔案,這個檔案有點類似於WinForm專案中的program.cs類,包含了專案啟動時的設定,在建立一個Silverlight專案成功後app.xam.cs的程式碼如下:
  1. usingSystem;
  2. usingSystem.Collections.Generic;
  3. usingSystem.Linq;
  4. usingSystem.Net;
  5. usingSystem.Windows;
  6. usingSystem.Windows.Controls;
  7. usingSystem.Windows.Documents;
  8. usingSystem.Windows.Input;
  9. usingSystem.Windows.Media;
  10. usingSystem.Windows.Media.Animation;
  11. usingSystem.Windows.Shapes;
  12. namespaceSilverlightDemo1
  13. {
  14. publicpartialclassApp:Application
  15. {
  16. publicApp()
  17. {
  18. this.Startup+=this.Application_Startup;
  19. this.Exit+=this.Application_Exit;
  20. this.UnhandledException+=this.Application_UnhandledException;
  21. InitializeComponent();
  22. }
  23. privatevoidApplication_Startup(objectsender,StartupEventArgse)
  24. {
  25. this.RootVisual=newMainPage();
  26. }
  27. privatevoidApplication_Exit(objectsender,EventArgse)
  28. {
  29. }
  30. privatevoidApplication_UnhandledException(objectsender,ApplicationUnhandledExceptionEventArgse)
  31. {
  32. //如果應用程式是在偵錯程式外執行的,則使用瀏覽器的
  33. //異常機制報告該異常。在IE上,將在狀態列中用一個
  34. //×××警報圖示來顯示該異常,而Firefox則會顯示一個指令碼錯誤。
  35. if(!System.Diagnostics.Debugger.IsAttached)
  36. {
  37. //注意:這使應用程式可以在已引發異常但尚未處理該異常的情況下
  38. //繼續執行。
  39. //對於生產應用程式,此錯誤處理應替換為向網站報告錯誤
  40. //並停止應用程式。
  41. e.Handled=true;
  42. Deployment.Current.Dispatcher.BeginInvoke(delegate{ReportErrorToDOM(e);});
  43. }
  44. }
  45. privatevoidReportErrorToDOM(ApplicationUnhandledExceptionEventArgse)
  46. {
  47. try
  48. {
  49. stringerrorMsg=e.ExceptionObject.Message+e.ExceptionObject.StackTrace;
  50. errorMsg=errorMsg.Replace('"','\'').Replace("\r\n",@"\n");
  51. System.Windows.Browser.HtmlPage.Window.Eval("thrownewError(\"UnhandledErrorinSilverlightApplication"+errorMsg+"\");");
  52. }
  53. catch(Exception)
  54. {
  55. }
  56. }
  57. }
  58. }
可以在Application_Startup()方法中通過設定RootVisual屬性來指定啟動那個頁面作為Silverlight的啟動介面。 關於XAML Silverlight中使用XAML作為Silverlight的介面設計語言,XAML是一種特殊的XML格式(就像XHTML也是一種特殊的XML格式一樣),現在我們不用太關注它,經過以後的練習就會慢慢理解XAML語言的特點。下面是一個普通的XAML頁面程式碼:

對於普通的Silverlight控制元件或者頁面(也就是除app.xaml),這個xaml程式碼主要包含了幾部分:它對應的後臺程式碼的類名(在上圖所示的是SilverlightDemo1.MainPage);使用者控制元件的高度和寬度(在上圖中所示的高寬分別是300400畫素);頂級佈局所使用的容器(在上圖中使用的是Grid)。在Silverlight中定義了一個Panel類,這個類是一個抽象類,它是用來介面佈局的,Panel類有如下子類:System.Windows.Controls.CanvasSystem.Windows.Controls.DockPanelSystem.Windows.Controls.GridSystem.Windows.Controls.Primitives.TabPanelSystem.Windows.Controls.Primitives.ToolBarOverflowPanelSystem.Windows.Controls.Primitives.UniformGridSystem.Windows.Controls.StackPanelSystem.Windows.Controls.VirtualizingPanelSystem.Windows.Controls.WrapPanel。在WinForm中我們直接往介面中拖控制元件就可以了,因為在WinForm中我們使用XY座標來定位控制元件的左上角頂點的位置,在ASP.NET中則可以使用Table或者DIV來佈局,在Silverlight中介面佈局和ASP.NETWinForm中都不一樣,相對要稍微複雜一些(個人感覺倒是有些和Java SE類似,在Java SE中有FlowLayoutBorderLayoutCardLayoutGridLayout),在Silverlight中介面佈局則有上面提到的那些類(莫非和Java SE一樣,因為要跨平臺,所以才會複雜一些)。利用這些介面佈局類及它們的組合可以實現複雜的介面佈局,當然如果你覺得仍不能滿足要求的話,可以介面佈局類。關於這些佈局類的用法將在下一篇講解。 Silverlight專案的編譯 大家都知道.NET專案都可以使用csc.exe編譯,其實VS在編譯專案是也是呼叫了csc.exe的,所以對於平常的簡單的想法的程式碼測試周公都是用記事本寫程式碼然後在命令列下呼叫csc.exe編譯。用VS編譯專案最終也會呼叫csc.exe來編譯,和以前編譯.NET專案不同的是,編譯Silverlight專案多加了一個命令列引數,這個命令列引數是“nostdlib”,它的作用說明如下: 從上圖可以看出,使用“nostdlib”引數的作用是不引用標準庫。在.NET類庫中核心類庫是mscorlib.dll,使用這個引數的作用就是不引用mscorlib.dll這些類(因為Silverlight要跨作業系統要支援多瀏覽器,所以不能帶有Windows系統的特色)。儘管在Silverlight中可以使用C#或者VB.NET程式設計,但是Silverlight中所使用的是.NET類庫的子集,在某些用法上受到限制。甚至有些類或者有些方法出現在Silverlight的執行環境中,但是這些類和這些方法並不能為開發者所用,所幸的是為了不必要的麻煩在編寫程式碼時出現的智慧感知中不會出現這些類或者這些方法。 當我們編譯Silverlight專案成功之後會得到一個dll檔案,它的檔案結構如下:

也就是除了一個dll檔案之外還會生成如下檔案: 一個.pdb檔案。假設Silverlight專案名為SilverlightDemo1,那個pdb檔名為SilverlightDemo1.pdb,這個檔案包含了VS需要的除錯資訊。 一個名為AppManifest.xaml的檔案。不管Silverlight專案名是什麼,這個檔名總不會變,在這個檔案裡包含了當前Silverlight專案所需要的程式集。在本例項中AppManifest.xaml的內容如下所示:

一個測試用的html檔案。假設Silverlight專案名為SilverlightDemo1,那個html檔名為SilverlightDemo1TestPage.html,即{Silverlight專案名}TestPage.html,也就是會以Silverlight專案名加TestPage作為檔名的html檔案。這個檔案檔案演示瞭如何在頁面中嵌入Silverlight控制元件,它的程式碼如下:
  1. <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <htmlxmlns="http://www.w3.org/1999/xhtml">
  3. <!--savedfromurl=(0014)about:internet-->
  4. <head>
  5. <title>SilverlightDemo1</title>
  6. <styletype="text/css">
  7. html,body{
  8. height:100%;
  9. overflow:auto;
  10. }
  11. body{
  12. padding:0;
  13. margin:0;
  14. }
  15. #silverlightControlHost{
  16. height:100%;
  17. text-align:center;
  18. }
  19. </style>
  20. <scripttype="text/javascript">
  21. functiononSilverlightError(sender,args){
  22. varappSource="";
  23. if(sender!=null&&sender!=0){
  24. appSource=sender.getHost().Source;
  25. }
  26. varerrorType=args.ErrorType;
  27. variErrorCode=args.ErrorCode;
  28. if(errorType=="ImageError"||errorType=="MediaError"){
  29. return;
  30. }
  31. varerrMsg="應用程式中未處理的錯誤"+appSource+"\n";
  32. errMsg+="程式碼:"+iErrorCode+"\n";
  33. errMsg+="類別:"+errorType+"\n";
  34. errMsg+="訊息:"+args.ErrorMessage+"\n";
  35. if(errorType=="ParserError"){
  36. errMsg+="檔案:"+args.xamlFile+"\n";
  37. errMsg+="行:"+args.lineNumber+"\n";
  38. errMsg+="位置:"+args.charPosition+"\n";
  39. }
  40. elseif(errorType=="RuntimeError"){
  41. if(args.lineNumber!=0){
  42. errMsg+="行:"+args.lineNumber+"\n";
  43. errMsg+="位置:"+args.charPosition+"\n";
  44. }
  45. errMsg+="方法名稱:"+args.methodName+"\n";
  46. }
  47. thrownewError(errMsg);
  48. }
  49. </script>
  50. </head>
  51. <body>
  52. <formid="form1"runat="server"style="height:100%">
  53. <divid="silverlightControlHost">
  54. <objectdata="data:application/x-silverlight-2,"type="application/x-silverlight-2"width="100%"height="100%">
  55. <paramname="source"value="SilverlightDemo1.xap"/>
  56. <paramname="onError"value="onSilverlightError"/>
  57. <paramname="background"value="white"/>
  58. <paramname="minRuntimeVersion"value="3.0.40818.0"/>
  59. <paramname="autoUpgrade"value="true"/>
  60. <ahref="http://go.microsoft.com/fwlink/?LinkID=149156&v=3.0.40818.0"style="text-decoration:none">
  61. <imgsrc="http://go.microsoft.com/fwlink/?LinkId=108181"alt="獲取MicrosoftSilverlight"style="border-style:none"/>
  62. </a>
  63. </object><iframeid="_sl_historyFrame"style="visibility:hidden;height:0px;width:0px;border:0px"></iframe></div>
  64. </form>
  65. </body>
  66. </html>
從程式碼中可以看到,如果瀏覽此頁面的客戶端沒有安裝Silverlight客戶端的話,就會看到一個下載安裝Silverlight客戶端的提示,使用者點選連結就可以跳轉到微軟官方網站下載Siverlight。下載完成會提示使用者是否安裝。也就是在下載和安裝Silverlight時都會得到明確的提示,使用者可以明確地選擇是否下載或安裝,這一點很值得國內的公司學習。國內很多以“正當”、“安全”自居的公司提供的軟體總是模糊、混淆某些概念來達到自己不可告人的目的,甚至還有幾款裝機量上億的軟體經常掃描使用者的非系統盤之外的敏感區域,這些公司都應該好好學習一下國外軟體的做法。 一些dll檔案。這些dll檔案是運行當前Silverlight專案所需要的依賴檔案。在AppManifest.xaml檔案中我們看到了裡面有除SilverlightDemo1.dll之外的如下檔案: System.ComponentModel.DataAnnotations.dll System.Windows.Controls.Data.dll System.Windows.Controls.Data.Input.dll System.Windows.Controls.dll System.Windows.Controls.Navigation.dll System.Windows.Data.dll zh-Hans/System.ComponentModel.DataAnnotations.resources.dll zh-Hans/System.Windows.Controls.resources.dll zh-Hans/System.Windows.Controls.Data.resources.dll zh-Hans/System.Windows.Controls.Data.Input.resources.dll zh-Hans/System.Windows.Controls.Navigation.resources.dll zh-Hans/System.Windows.Data.resources.dll 在上面的檔案都是執行Siverlight專案的依賴檔案。其中zh-Hans資料夾中的檔案都是一些資原始檔,當然除了zh-Hans之中的檔案之外,還有其它類似於zh-Hans資料夾的資料夾,它們裡面的檔案檔名和zh-Hans資料夾下的檔名一樣,這些檔案是語言資原始檔。 說到Silverlight專案的依賴檔案就不得不說一下Silverlight專案的核心檔案。大家知道Siverlight程式是被下載到客戶端執行的,所以需要在客戶端安裝Silverlight執行環境,為了方便在不同網路環境下的使用者下載和安裝Silverlight執行環境,所以這個執行環境要儘可能的精簡(實際上只有5M),既然它被精簡了所以自然不可能提供.NET Framework提供的所有功能。在Silverlight執行環境中包含了如下程式集: mscorlib.dll:注意此mscorlib.dll.NET Framework中的mscorlib.dll,不過在Silverlight執行環境中它提供了類似於NET Framework中的mscorlib.dll的功能,是Silverlight執行環境中核心類庫(核心中的核心)。 System.dll:提供了泛型、URI處理及正則表示式相關功能的類。 System.Core.dll:提供了對LINQ的支援。 System.Net.dll:提供了網路功能,這樣我們下載Web檔案和建立基於Socket的網路連線。 System.Window.dll:提供在Silverlight中建立UI的類。 System.Window.Browser.dll:提供了對HTML元素互動操作的類。 System.Xml.dll:提供了XmlReaderXmlWriter兩個類用以處理Xml 可以看出在AppManifest.xaml中出現的那些除SilverlightDemo1.dll之外的dll都沒有在Silverlight執行環境所提供的核心類庫中。前面說了Siverlight執行環境的設計理念是儘可能使其安裝和下載體積小,所以Siverlight執行環境的設計者在核心類庫之外又提供了一些類,這些類提供的功能並不是在每個Silverlight應用中都會用到(如果總會用到就會放到核心類庫中了),所以以附加類庫的形式提供。當利用VS編譯Silverlight專案的時候,VS會自動檢測那些本專案需要但又不在Silverlight核心類庫中的dll,所以我們會在bin目錄下會看到一些“不知道怎麼跑出來的”dll檔案。 在這些附加類庫中經常會用到的dll有如下幾個:System.Window.Controls.dllSystem.Window.Controls.Data.dllSystem.Window.Controls.Data.Input.dllSystem.Window.Controls.Input.dllSystem.Windows.Controls.Navigation.dll,確實這幾個檔案都在我們的AppManifest.xaml檔案中出現了。 一個.xap檔案。同樣假設Silverlight專案名為SilverlightDemo1,那個xap檔名為SilverlightDemo1.xap,這個xap檔案其實是一個壓縮檔案,我們可以直接使用WinRAR或者其它壓縮軟體開啟這個xap檔案(如果不嫌麻煩可以將SilverlightDemo1.xap改名為SilverlightDemo1.xap.zip再用解壓軟體開啟)。下圖是使用WinRAR直接開啟SilverlightDemo1.xap的情景:

從上圖中我們看到了前面提到的AppManifest.xamlSilverlightDemo1.dll檔案以及上面提高的“一些”dll檔案,這些dll檔案都是在AppManifest.xaml中出現過的、SilverlightDemo1專案所需的附加dll。適用xap的方式釋出Silverlight有兩個好處:一是xap檔案是壓縮過的檔案,可以減少網路流量以提高下載速度;二是便於部署,如果你想部署Silverlight部署到別某個網站僅僅需要將這個xap檔案拷貝到網站所在的目錄然後建立一個嵌入Silverlight的頁面就夠了,超級簡單。 Silverlight專案的部署 前面講到部署Silverlight專案需要的僅僅是一個xap檔案和一個包含了如何設定Silverlight專案的網頁檔案。有時候出現這樣的情況,建立專案的時候取了一個名字,到最後釋出的時候覺得這個名字不直觀,那麼我們可以通過VS來設定最終生成的Silverlight專案的檔名,具體方法就是在Silverlight專案上點選滑鼠右鍵選擇“屬性”,出現如下視窗:

從上圖可以看出,在這個面板中我們可以指定如下跟Silverlight專案有關的東西: 應用程式集名稱:即最終生成的dll檔名; 預設空間名:即建立程式碼檔案時預設所使用的namespace名稱; 啟動物件名:可以看出為什麼在App.xaml中的Application_Startup()方法中指定啟動那個窗體就會啟動那個窗體,因為預設是啟動App物件的,所以它的制定才有用,如果在專案中建立了多個類似於App.xaml的檔案,則會在這裡出現多個選擇; 生成的Silverlight應用的版本:如果安裝了多個Silverlight SDK的話,這裡會有多種選擇; 最終生成xap檔名:可以將其改為更直觀的名字。 從本篇前面的講解可以知道Silverlight最終會被下載到客戶端執行,客戶端下載到的是一個xap檔案,這個xap檔案從本質上來說其實就是一個壓縮檔案。如果解壓這個檔案就可以得到Silverlight專案的dll檔案,遇上有心人是可以利用一些反編譯工具得到原始碼的,如下圖就是使用著名的反編譯軟體Reflector開啟本篇中的dll檔案的情形:

從圖中可以看到利用這個軟體可以很方便地檢視沒有經過任何處理的.NET程式集或者Silverlight程式集程式碼(以MSIL形式儲存的),所以為了安全起見不要再Silverlight中儲存任何隱私的、安全相關的資料。除此之外還可以對生成的程式集進行進行加密或者混淆,加密就是利用MSIL指令的一些特點使反編譯工具無法反編譯出原始碼,混淆時是對程式集中的變數名和方法名加以變化,使其不再具有望文知義的特點從而達到了即使反編譯得到了原始碼也難以閱讀的目的。在VS中本身就提供了一個程式碼混淆工具Dotfuscator的社群版,這是一個免費但功能有限的.NET程式碼混淆工具,它的介面如下:

如果是一般的專案,可以使用Dotfuscator進行混淆,這樣可以使一般的窺探者望而生畏。 對於軟體的程式碼保護是一個長期以來一直在探討的話題,在本篇裡提出來只是讓大家有這方面的意識,而不是讓大家把大部分精力都放在如何組織窺探自己的原始碼上了。對軟體原始碼的反保護和保護一直是矛和盾的問題,二者相互競爭相互發展,不管使用什麼語言都難以徹底有效地避免這個問題。 總結 在本篇講解了在VS中開發Silverlight的介面、Silverlight專案的組成以及編譯和部署Silverlight專案時涉及到的一些知識和注意事項。本篇仍是在做準備,下一篇就會講到Silverlight的介面佈局,學習開發Silverlight面臨的第一個問題就是介面佈局問題,下一篇就會講解常見的介面佈局。 2010-09-13

轉載於:https://blog.51cto.com/zhoufoxcn/391313