2011年12月20日 星期二

C#的委派與事件的使用

委派跟事件,一直是蠻難真正搞懂的一個概念,但是對UI寫作的人或是開發控制項的人來說,卻又經常用到,我想寫系統的人或許也有機會碰到吧,過去一段時間,我一直沒辦法完全搞懂,甚至只是很皮毛的瞭解就拿來用了。為了讓自己更有概念一點,這次花了些時間學習,記錄如下。




◆什麼時候會用到委派?

有兩種狀況:
1.你要寫一個Class或Interface,其中有個函式,會讓別的Class呼叫(注意,是Class,不是Instance喔)。也就是在撰寫類別的時候,就能夠呼叫非實體的函式。


2.你要寫一個Class或Interface,其中有個函式,會達成某種特別功能,但是,寫的時候,你並不知道這個功能會怎麼完成,好比說,你這個Class是個登入的介面或Model,但是密碼驗證的部分,是你提供方法出來,給要使用你這個Class的人,到時候要實作函式內容的(將委派綁定函式)。

當你撰寫一個Class裡面需要呼叫該Class無法呼叫到的函式(當然,就不是這個Class宣告的函式囉)的時候,就會需要用到委派,而什麼情況下Class無法呼叫某個函式呢?我們先看看,什麼情況下,Class可以呼叫非Class自己的函式呢?比方有兩個Class,一個是ClassA一個是ClassB,如果在ClassA中宣告產生了ClassB,那麼ClassB的函式就可以被ClassA呼叫(如果宣告成Public或是有封裝出來),這是物件導向的基本概念,相信大家都懂,但是,如果ClassB想呼叫ClassA的函式呢?那就做不到了。程式如下:


Class ClassA
{
     public void RunClassA()
    {
        ClassB MyClassB = new ClassB();
         MyClassB.MethodB();
    }

    public void MethodA()
   {
        Console.WriteLine( "MethodA被呼叫了" );
    }
}



Class ClassB
{
     public void RunClassB()
    {
        ClassA.MethodA();
    }

    public void MethodB()
   {
        Console.WriteLine( "MethodB被呼叫了" );
    }
}




上述紅底的那一行,就是無法做到的,因為ClassB沒有宣告ClassA,對ClassB來說,他不曉得ClassA是什麼,那麼,如果在ClassB也宣告一個ClassA呢?那麼A中有B,B中又有A,A中又有B,無限循環下去記憶體會吃光光,這種怪程式應該無法跑不下去,有解決方法嗎?有啊,除了用Static來做,或是把ClassA傳進來給ClassB......但是,有時候ClassA不是你寫的,你沒辦法預期人家怎麼做,但是卻又有這種需求,這時候就需要委派了。



◆委派怎麼做呢?
先不要講程式,免得把人搞昏了,概念上,就是ClassB這邊,宣告一個叫做「委派」的東西,這個委派,可以讓ClassB被別人宣告使用的時候,也同時可以使用這個委派,透過特殊的語法,在ClassA把委派跟某個函式綁在一起,這樣只要有人(不論ClassB或ClassA都可以)叫這個委派做事,這個委派就會去找到這個函式,然後執行,這樣ClassB就可以呼叫到ClassA了,聽起來似乎落落長,實際上不難,我們來看看怎麼做。


再稍微細節一點來看,這個作法,就很像是把ClassA的函式的記憶體位址告訴ClassB的委派,而委派大概這麼使用的,這個程式語法跟C#原本語法概念不太相同,不好理解,當成公式吧,要用的時候查就好了。


在ClassB裡頭,先宣告委派

        public delegate int DelegateDefine( String MyPara );

好複雜難懂得一行,不急,這邊指示先宣告委派型別,目的是定義好你這個委派會呼叫什麼樣的函式,那個函式有怎樣的參數,又是怎樣的回傳型態。比方說,這裡是宣告說,我有一個委派叫做DelegateDefine,他到時候要呼叫一個「會傳入一個String的函式,然後這函式的回傳值,是int,就這樣而已。


接下來,把這個委派產生成物件


        public DelegateDefine DelegateObj;


接下來ClassA就可以開始把委派跟函式綁在一起,當然,先決條件就是這個委派宣告的函式型態,可得跟ClassA要綁定的函式一樣喔,比方,函式如下


        public int ClassA_Method( String Paras )
        {
            return 1;
        }



然後開始綁定,可以把綁定寫在ClassA的建構子,也可以寫在某個函式裡面,只要能寫在某件事情之前,什麼事情?就是要叫用那個ClassB的委派之前就行了。綁定的語法也是比較特殊,就是把委派物件跟函式綁在一起就是了。



            My_ClassB.DelegateObj = new ClassB.DelegateDefine( ClassA_Method );




看起來有點複雜,有沒有簡化的寫法?有,有,有,經過簡化過後你只需要這樣寫就行了:
            My_ClassB.DelegateObj = ClassA_Method;








之後,不論ClassA或ClassB都可以用DelegateObj.Invoke( "xxx" );來呼叫函式ClassA_Method 了(xxx就是看你到時候要傳什麼當參數囉),就這樣,很簡單吧?






我寫了一個實際的小範例,大概是這樣的,有一個Class是使用者控制項,用來設計UI放元件的,叫做UC_Child,另外,有兩個Class是Form,也是用來設計UI的,分別叫做Form_Mother與Form_Father,UC_Child設計好了之後,會被Form宣告使用,很顯然的,Form就可以呼叫並使用UC_Child寫好的函式。但,這裡我需要讓UC_Child反向來呼叫Form這邊的函式呢?比方UC_Child這邊按下某個按鈕,或是完成收送之後,要通知Form來更新畫面呢?這個更新畫面,當然是只能寫在Form這邊,而無法寫在UC_Child,這時候,就要透過委派了。


這個範例,除了很簡單的做出委派之外,也包含了幾個委派的特性


1.委派可以同時綁兩個以上的函式
2.委派可以讓很多Parent宣告使用
3.委派綁定了函式之後,當呼叫函式時,並不會在遇到Return的時候就走回去,而是會把整個函式跑完的。
4.委派產生之後,不但Child自己可以Invoke,連Parent也可以呼叫Invoke,只不過,Parent用起來就沒什麼太大的實質意義了。
5.委派同時綁兩個以上的函式之後,會每個函式都跑過了,才會回到委派的下一行來。所以在Child裡面的Btn_Delegate_Click()裡,呼叫了DelegateObj.Invoke()之後,即便他綁了兩個函式,也不會回到這邊兩次,只會最後回到這邊來,然後帶著最後一個回傳值喔。




範例放在這邊   跟這邊



那麼,什麼是事件呢?其實大家對事件的接觸跟瞭解應該反而比委派多,就我目前瞭解,委派跟事件幾乎一樣,用法差不多,反而事件還比較複雜一點,據說,事件有多一些保護機制,但是在我瞭解之前,我也不亂多說,在上面的Link當中有Delegate跟Event兩個範例,差異實在很小。


1.原本在Child要把委派產生個實體出來,要用 事件 的方式的話,就不用,變成用以下的特殊語法,產生一個符合那個委派的事件,然後在Father跟Mother改成用事件跟函式綁定


public event DelegateDefine On_Env_Obj;


2.在Father跟Mother原本也可以叫用的Child的委派,現在改用事件的話,無法叫用Child的 事件 喔,也就是程式裡遮掉的那行
  //My_Child.On_Env_Obj.Invoke 不可以





2011年10月24日 星期一

WCF在Silverlight的使用方式

首先,瞭解到WCF是一種SOA的實踐(詳細請參考這裡),把服務跟供應商跟技術切開,在技術上就會用到「合約」這個詞,而Server端則多半會稱為商業物件,會講到這個,因為很多書上都直接省略了來源,沒有瞭解到這個淵源,會很容易不瞭解書上面在講什麼死人骨頭。


再來,Silverlight執行在用戶端的瀏覽器上,ASP.NET則執行在伺服器端,故使用WebService上有很大的不同(權限、安全性)。Silverlight需要將存取機制的程式段放在「資料存取服務層」來遠端呼叫。網路上的應用需要注意到Server在預設是無法跨Domain的,需要透過ClientAccessPolicy.xml或CrossDomain.xml(這兩個檔案,網路上搜尋到之後,直接下載來用就行了)來達成,再者安全性也是需要顧慮的,可以透過SSL來加強。


接下來,可以逐步來實踐出可以實用,可以發佈到IIS上的WCF應用了。




一、在方案內的Web專案加入新項目,加入「有Silverlight功能的WCF服務」,這裡當然也可以加入「WCF服務」,兩者差異大概除了一個是僅建立Interface而已,再者在binding="wsHttpBinding這個設定上,一個是標準的,一個是為了SilverLight而特製修改的,使用標準的,才能讓這個WCF跟一般的WCF相容,但使用上會有問題(可能是讓Silverlight跨Domain會無法呼叫使用此WCF)。






二、WCF建立好之後,將方案重新建置,WCF的設定才會被建立起來,假設建立的WCF名稱是Service_TestAg,那在Web專案當中會看到新增了Service_TestAg.svc跟Service_TestAg.cs,點開.cs檔,就可以看到屆時可以被呼叫的Method,預設叫做 void DoWork(),可以自己修改參數、名稱、回傳型態,也可以增加更多的Method。





三、在方案內的Silverlight專案加入服務參考,選擇「探索」,會列出目前Local所有的WCF服務,還可以再點開確認可作業的Method。底下的命名空間,命名好之後,會在之後的Silverlight的撰寫當中會用到,所以不要亂命名,這裡,我們假設你設定的名稱是ServiceRef_Test。如果設定好之後,在「方案總管」畫面,就會看到一個Service References資料夾,裡面會有剛剛命名好的服務參考。機制上,就是透過代理物件,來呼叫後端的WCF服務,內部詳細書上並沒有講得很清楚,只知道是利用ServiceReferences.ClientConfig來達成,所以暫時是個黑箱。







四、接下來就是WCF的使用了,我們在Silverlight的Page裡面要呼叫使用WCF的地方(比方按鈕事件),產生WCF的物件來用,語法是ServiceRef_Test.Service_TestAgClient Wcf_Test = new ServiceRef_Test.Service_TestAgClient() ;是的,我們並不是用Service_TestAg這個服務名稱,也不是用ServiceRef_Test這個參考代理名稱來產生物件,而是用參考內的xxxxxxxxxClient來產生,為什麼?我不知道,我只知道,這是他內部一些機制作掉之後的結果,只好背下來了。然後因為呼叫服務是透過非同步的方式來達成,所以呼叫之後,網頁不用在那邊等待,遠端回應的時候呼叫Method來做事就好了。怎麼做呢?我們需要綁定一個特定Method讓呼叫完成之後得以藉由事件觸發這個特定Method。




五、如果你要呼叫的Method叫做DoYourWork( ),則這裡要綁定的Method則叫做DoYourWorkCompleted,而Visual Studio提供我們很方便的建立方式,讓我們可以很快速方便的建立出Wcf_Test.DoYourWorkCompleted += new EventHandler<SL_APP_Test.ServiceRef_Test.DoYourWorkCompletedEventArgs>(Wcf_Test_DoYourWorkCompleted);這個長到不行的一行程式。只要輸入Wcf_Test這個物件名稱,按下句點「.」就可以選到DoWorkCompleted這個事件,然後按下 += 然後按下Tab,就會自動產生上述的一行程式,注意,這時候會看到那一行還是顯示錯誤,編譯也不會過,因為這個DoWorkCompleted事件並沒有被宣告出來,我們還得做這個事件。




六、建立Wcf_Test_DoYourWorkCompleted這個Method,需要注意的是,這個Method的第二個參數必須跟第五點那個落落長的那一行程式裡面的<SL_APP_Test.ServiceRef_Test.DoYourWorkCompletedEventArgs>一樣


        private void Wcf_Test_DoYourWorkCompleted( object sender, SL_APP_Test.ServiceRef_Test.DoYourWorkCompletedEventArgs e )
        {
                // 當收到回應並完成之後,你想做什麼?寫在這裡
                // 可以控制UI物件        }






七、當上述的關連都建立好之後,最後,呼叫DoWorkAsync( )就能呼叫你撰寫的Method:DoWork( )

2011年10月12日 星期三

WCF觀念介紹


瞭解WCF之前,先瞭解什麼是SOA

維基百科的簡單定中描述到SOA是一個軟體架構,並且包含了兩個重點:”loosely coupled software service 低偶合力的軟體服務” 以及 ”business process 商業流程”。好複雜的詞,我們簡單來看吧。SOA想達到什麼?消費者能夠自由的購買他想要的軟體服務與服務提供者。您想要的是買一杯清涼解渴的紅茶;7-11、 全家便利、甚至是巷口的乾杯都提供了相關的服務;您可以照您心情喜好自由選擇紅茶的提供者

為什麼要說 WCF SOA 最佳實作技術
WCF 軟體技術在創作時,一開始就是希望解決這個問題空間,讓我們先看看 WCF 技術的核心概念:ABC

WCF 的設計中,服務的提供者透過Address的定義描述到服務的絕對定址;透過Contract來描述到提供的服務內容;最後透過Binding來描述到服務內容的提供方式。舉例來說:7-11提供了”沖洗照片的服務 (Contract)”;現在我想要到”吳興街281巷口 (Address)”那間 7-11 沖洗相片,所以我自己靠自己走過去請”櫃台人員收件 (Binding)”幫我沖洗我家小美女的照片。但我家的太太,她一樣要到同一家7-11(相同的 Address)去沖洗照片(相同的 Contract)可是她卻透過7-11提供的網站服務(不同的Binding方式)直接傳送照片沖洗;透過 ABC 的架構,軟體元件所提供的服務可以多元的定義;您的訂單服務可以被 WCF 技術加值為支援 Web Service、支援 MSMQ、支援 TCP 甚至是WS-* 的溝通協定。


優點:
1.   提供靈活方便的版本升級架構
2.   MSMQ提高可靠度
3.   完整的高安全性支援
4.   內建的 Logging & Tracing 訊息增加管理方便性



我們會用WCF做什麼呢?簡單來說,Silverlight的設計架構上,分成兩個部分,一個是執行在Client端的View的呈現,一個是寫在後端用來存取資料的模組,可能是一些WebService或WCF服務,這些服務才有權限可以碰觸後端的資料庫。所以前端那些漂亮的Silverlight展示層,就得透過呼叫使用WCF來跟後端的資料溝通。


資料來源

2011年10月4日 星期二

Silverlight 4 新增功能

Silverlight 4 的新功能

RichTextBox 控制項
您可以利用 RichTextBox 控制項顯示、輸入及編輯 RTF 文字。您可以將字元或段落格式套用至文字、顯示超連結以及加入內嵌影像。如需詳細資訊,請參閱 RichTextBox 概觀
Viewbox 控制項
Viewbox 控制項是內容 Decorator,可以接受一個子項目並加以延展或縮放來符合 Viewbox 的大小。如需詳細資訊,請參閱 Viewbox
WebBrowser 控制項
WebBrowser 控制項會在應用程式執行於瀏覽器外部時,提供顯示 HTML 內容所需的介面。如需詳細資訊,請參閱 WebBrowser
WebBrowserBrush 控制項
您可以使用 WebBrowserBrush 控制項從 WebBrowser 控制項中顯示 HTML 內容。例如,您可使用 WebBrowserBrush 來繪製圖案的 Fill,像是 Rectangle  Path 的幾何內容。如需詳細資訊,請參閱 WebBrowserBrush
http://i.msdn.microsoft.com/Hash/030c41d9079671d09a62d8e2c1db6973.gif
瀏覽器外用支援
瀏覽器外用應用程式現在支援幾項瀏覽器裝載應用程式無法使用的功能,包括下列各項:
·         Window 功能,包括執行階段調整大小、最上層顯示功能,以及您可以取消的 Closing 事件。
·         支援離線數位版權管理 (DRM)
·         搭配 WebBrowser 控制項的 HTML 裝載。
·         搭配 NotificationWindow 類別的快顯警示。
·         支援更高的信任。
·         改善對瀏覽器外用應用程式偵錯的支援。
如需詳細資訊,請參閱瀏覽器外用支援。下列各節也會說明其中一些功能。
信任的應用程式
您可以設定瀏覽器外用應用程式以要求更高的信任。信任的應用程式可以略過 Silverlight 安全性沙箱的部分限制,並與原生功能整合。例如,以更高信任執行的瀏覽器外用應用程式可以讀取和寫入使用者資料夾中的檔案,並且在沒有鍵盤限制的情況下使用全螢幕模式。
此外,信任的應用程式可以存取啟用瀏覽器外用應用程式視窗完整自訂的 Window API。例如,信任的應用程式可以隱藏視窗標題列和框線,並提供用於移動、調整大小或關閉視窗的自訂使用者介面項目。
信任的應用程式會在安裝之前向使用者顯示安全性警告。不過,Silverlight 會對信任的應用程式支援應用程式簽章,並對含有已驗證簽章的應用程式顯示更可靠的警告。
如需詳細資訊,請參閱 信任的應用程式  System.IO
晚期繫結的比較
Silverlight 現在同時在 Visual Basic C# 中支援晚期繫結。Visual Basic 預設會對 Object 型別的變數支援晚期繫結。C# 會對 dynamic 型別的變數支援晚期繫結。這可讓您更容易搭配使用擷取自 HTML DOM Automation API 的物件。
為了支援 HTML DOM 項目的晚期繫結,ScriptObject 類別現在會實作 IDynamicMetaObjectProvider 介面。為了支援 Automation API,已經將 AutomationFactory 類別及相關的類別加入 Silverlight 架構中。
如需 Automation 的詳細資訊,請參閱 HOW TO:在信任的應用程式中使用自動化


網路攝影機和麥克風
您現在可以從使用者的音訊裝置或視訊裝置擷取來源輸入。CaptureImageAsync 方法會啟用簡單的螢幕擷取情節,而 VideoBrush.SetSource 方法則啟用簡單的視訊播放情節。更進階的情節可以存取原始音訊或視訊,並處理成各種檔案格式。網路攝影機和麥克風擷取都會使用接收器比喻來建立接聽程式類別,而且在取得擷取時,必須有用戶端使用者權限才能存取擷取裝置。如需詳細資訊,請參閱 CaptureSourceAudioSinkVideoSink 網路攝影機和裝置概觀
離線使用的 DRM
有許多新功能已整合到可用來實作離線情節的 Silverlight DRM (包括購買、下載、租賃和訂閱)。如需詳細資訊,請參閱數位版權管理 (DRM)
多重轉換
您現在可以使用 CompositeTransform 類別將多重轉換套用至相同物件,例如傾斜和旋轉。這個類別會依慣用順序套用多重轉換,通常比使用 TransformGroup 類別還要更適合用來將多重轉換套用至物件。
多點傳送
System.Net.Sockets 命名空間已加入對 UDP 多點傳送用戶端的支援。這項支援讓網路用戶端可以利用多點傳送,更有效率地使用網路資源。如需詳細資訊,請參閱使用多點傳送主題與 System.Net.Sockets.UdpAnySourceMulticastClient System.Net.Sockets.UdpSingleSourceMulticastClient 類別。
使用 HTTP 擷取通訊端安全性原則
對於使用 System.Net.Sockets 的連線要求,應用程式可以選擇在 TCP 連接埠 80 上使用 HTTP 通訊協定擷取通訊端原則檔,而不是在連接埠 943 上使用自訂的 TCP 通訊協定。這可讓已經在執行 HTTP 服務的 HTTP 伺服器授權來自 Silverlight 應用程式的通訊端連線,而不需要在伺服器上部署新的 TCP 伺服器服務以及針對連接埠 943 開啟通過防火牆的連接埠。此通訊端原則檔是將已解析 IP 位址當做主機 (通訊端連線的目標) 使用,透過 HTTP 所擷取。這會針對電腦資源所需的目標 (例如通訊端) 產生授權式全電腦原則。相較之下,供 System.Net 命名空間中之 WebClient  HTTP 類別使用的原則檔則擷取自 HTTP 要求設為目標的主機網域。HTTP 通訊協定允許透過主機標頭,針對每個網域隔離資源。 如需詳細資訊,請參閱 Silverlight 中的網路安全性存取限制
對信任的應用程式採取寬鬆的安全性原則
System.Net.Sockets 命名空間包含對使用 System.Net.Sockets 進行通訊之瀏覽器外用信任應用程式套用寬鬆安全性原則限制的支援。如需詳細資訊,請參閱 Silverlight 中的網路安全性存取限制  信任的應用程式
用戶端 HTTP 處理
當您選擇透過用戶端 HTTP 處理進行網路呼叫時,就已經取得多項新增的功能:
·         在所有要求上傳送 Referer 標頭
·         基本驗證和 NTLM 驗證支援
·         快取支援
·         能夠啟用或停用對讀取和寫入要求的資料流緩衝
·         同時連線限制從 2 條提高到 6 條連線
如需選擇加入用戶端 HTTP 處理的詳細資訊,請參閱 HOW TO:指定瀏覽器或用戶端 HTTP 處理
http://i.msdn.microsoft.com/Hash/030c41d9079671d09a62d8e2c1db6973.gif

您現在可以使用 PrintDocument 類別,列印 Silverlight 應用程式的使用者介面。PrintDocument 可讓您向使用者顯示列印對話方塊,並列印應用程式或應用程式中包含的 UIElement。如需詳細資訊,請參閱列印
http://i.msdn.microsoft.com/Hash/030c41d9079671d09a62d8e2c1db6973.gif

拖放功能
Silverlight 4 引入支援拖放功能的 API。您可以從 Silverlight 內容區域外面的應用程式選取檔案清單,例如從 Microsoft Windows [我的文件] 選取。您可以接著將選取的檔案清單拖放至 Silverlight 內容區域,並處理特定目標項目上的置放事件,然後使用 FileInfo 資訊 (其中包含透過資料流對檔案內容的存取) 處理檔案清單。啟用這項功能的方式是將 Drop 事件和相關事件以及屬性加入至基底 UIElement 類別。支援類別 (例如 DragEventArgs) 也包含在內。
剪貼簿存取
Silverlight 4 引入支援剪貼簿物件存取的 API。您可以對共用的 Clipboard 物件進行 Unicode 文字資訊的取得或設定作業。請注意,這樣的存取需要選擇使用者權限,而且只限於 Unicode 文字資料。還有其他限制,如 Clipboard 參考主題中所述。
按右鍵滑鼠事件
Silverlight 4 已將 MouseRightButtonDown  MouseRightButtonUp 事件加入基底 UIElement 類別。應用程式現在可以處理按右鍵滑鼠事件並變更行為。根據預設,當使用者以滑鼠右鍵按一下 Silverlight 應用程式時,就會開啟 Silverlight 組態對話方塊。
命令
Silverlight 4 中,ButtonBase  Hyperlink 支援 Command  CommandParameter 屬性。Command 屬性可透過 {Binding} 用法,參考來自檢視模型資料來源的 ICommand 實作。 然後,Silverlight 輸入系統就會在執行階段中解譯此命令。如需詳細資訊,請參閱 ButtonBase.Command Hyperlink.Command
隱含樣式
您現在可以隱含設定 Style。隱含樣式允許您將特定樣式套用至特定型別的所有項目。如需詳細資訊,請參閱 Style 透過建立 ControlTemplate 建立新的控制項
由右至左流向
您現在可以將每個控制項的內容和配置的方向設定為由右至左流動。這樣您就可以使用各國的語言 (例如希伯來文和阿拉伯文) 來開發 Silverlight 應用程式。您可以使用 FlowDirection 屬性來設定流向。如需詳細資訊,請參閱FlowDirection
全螢幕支援
Silverlight 現在允許應用程式在其他應用程式取得使用中狀態時保留全螢幕模式。如需詳細資訊,請參閱 FullScreenOptions 屬性。
基底項目 API 變更
除了上述功能之外,在 DependencyObject, UIElement  FrameworkElement 中還有下列變更可能對 UI 情節有意義:
·         FrameworkElement.Cursor 屬性現在可以透過屬性系統 API 加以設定。
·         FrameworkElement 具有 Unloaded 事件。
·          UIElement 層級支援輸入法的文字事件,這樣您就可以善加運用路由功能。
·         SetValue 呼叫與 WPF 對等行為更加一致,特別是在執行動畫時。
http://i.msdn.microsoft.com/Hash/030c41d9079671d09a62d8e2c1db6973.gif

Silverlight 4 引入新的 XAML 剖析器做為 Silverlight 執行階段的一部分。 Silverlight 中的新 XAML 剖析器會提供下列功能:
·         與原本針對 WPF 所撰寫的 XAML 更相容。
·         [MS-XAML] 規格中定義的 XAML 語言更相容。
·         可讓工具及其他 XAML 消費者藉由較可預測的方式整合 Silverlight XAML 設計階段經驗。
為了針對 Silverlight 3 應用程式提供最佳相容性,Silverlight 4 執行階段會包含來自 Silverlight 3 XAML 剖析器。Silverlight 3 XAML 剖析器是用來載入特別以 Silverlight 3 為目標之應用程式的任何 XAML 新的剖析器會載入以 Silverlight 4 為目標之應用程式的 XAML。這兩個剖析器會同時並存。
如需 Silverlight 3 Silverlight 4 XAML 剖析之間 XAML 行為差異的詳細資訊,請參閱 Silverlight 3 Silverlight 4 之間的 XAML 處理差異
Silverlight XAML WPF XAML 之間具有一些差異。如需詳細資訊,請參閱 Silverlight 各版本和 WPF 之間的 XAML 處理差異

資料繫結
Silverlight 資料繫結現在支援下列功能:
·         繫結至 DependencyObject 執行個體。
·         繫結至 String 索引子。
·         可以透過 StringFormat 屬性指定 String 格式化選項。
·         可以透過 FallbackValue  TargetNullValue 屬性指定預設顯示值。
·         可以透過 CollectionViewSource 類別的 GroupDescriptions 屬性群組集合項目。
·         支援 ICollectionViewFactory 介面,這個介面可讓自訂資料實體集合提供自訂 ICollectionView 實作給 CollectionViewSource  DataGrid 類別。
·         支援複雜的繫結物件多屬性驗證,這些物件會實作 INotifyDataErrorInfo  IDataErrorInfo 介面。這包括繫結引擎或使用者介面控制項 (例如 DataGrid) 對這些介面的支援。
如需詳細資訊,請參閱資料繫結
新的 DataServiceCollection<T> 類別會為 WCF 資料服務傳回的資料提供簡化的繫結。這個類別繼承 ObservableCollection<T> 類別,當繫結控制項中的資料有所變更時,就會自動更新繫結資料。如需詳細資訊,請參閱 HOW TO:將資料服務資料繫結至控制項 (WCF 資料服務/Silverlight)
WCF Data Services - WCF 資料服務
Silverlight 的這個發行版本中,已將下列功能加入 WCF 資料服務用戶端:
·         新的 DataServiceCollection<T> 類別會為 Silverlight 控制項提供簡化的資料服務資料繫結。這個類別繼承 ObservableCollection<T> 類別,當繫結控制項中的資料有所變更時,就會自動更新繫結資料。如需詳細資訊,請參閱HOW TO:將資料服務資料繫結至控制項 (WCF 資料服務/Silverlight)
·         Silverlight WCF 資料服務用戶端現在同時支援瀏覽器外用和跨網域執行。如需詳細資訊,請參閱 WCF 資料服務 (Silverlight)
Silverlight 的這個發行版本中,WCF 資料服務用戶端支援下列新的直接資料通訊協定 (OData) 功能:
·         OData 服務只能傳回 URI 所代表資源的總數,或是將這個資料列計數資訊與資源資料一併納入單一回應中。Silverlight 已經將 WCF 資料服務用戶端更新為允許您在應用程式中以查詢回應存取這個資料列計數資訊。如需詳細資訊,請參閱查詢資料服務 (WCF 資料服務) (英文)
·         您可以設定資料服務以一組分頁回應的形式傳回要求的資源。Silverlight 已經將 WCF 資料服務用戶端更新為允許您處理這類的分頁回應。如需詳細資訊,請參閱載入延後內容 (WCF 資料服務) (英文)
·         OData 服務傳回的查詢結果現在可以投影至任意定義的型別中。Silverlight 已經將 WCF 資料服務用戶端更新為支援在 LINQ 查詢中使用 select 子句 ( Visual Basic 中為 Select) 以進行投影。如需詳細資訊,請參閱查詢投影 (WCF 資料服務) (英文)
·         Silverlight 已經將 WCF 資料服務用戶端更新為讓您將二進位屬性當做來自支援媒體資源之 OData 服務的資料流,進行取得和設定作業。如需詳細資訊,請參閱載入延後內容 (WCF 資料服務) (英文)
http://i.msdn.microsoft.com/Hash/030c41d9079671d09a62d8e2c1db6973.gif


WCF RIA 服務
WCF RIA 服務會簡化豐富網際網路應用程式 (Rich Internet ApplicationsRIA) N-Tier 解決方案 (例如 Silverlight 應用程式) 的開發。在開發 N-Tier RIA 解決方案時常見的問題是使中間層與展示層間的應用程式邏輯協調一致。RIA 服務解決這個問題的方式是,提供架構元件、工具和服務,讓 RIA 用戶端可以取得伺服器上的應用程式邏輯,而不需要手動複製該程式設計邏輯。RIA 服務會搭配 Silverlight 4 運作,但也可以做為個別的安裝。如需詳細資訊,請參閱 WCF RIA 服務 (英文)
巡覽擴充性
您可以擴充 Silverlight 巡覽,以便支援任意的 URI 解析。例如,您可以針對 URI 重新導向、動態網頁產生以及伺服器的頁面隨選下載來實作巡覽擴充。
Frame  NavigationService 類別也會提供 Refresh 方法。當您使用可根據特定網頁之使用者互動來為相同 URI 傳遞不同內容的巡覽擴充時,這會很有用。例如,這樣就可以啟用一些需要使用者驗證的頁面巡覽情節。
如需詳細資訊,請參閱巡覽概觀
Dynamic Language Runtime
Dynamic Language Runtime (DLR) 是指在 CLR 中加入了一組動態語言服務的新執行階段環境。為了支援 DLR.NET Framework 中已加入新的 System.Dynamic 命名空間,而且運算式樹狀架構也延伸為納入用以表示控制流程的新型別,例如 LoopExpression  TryExpression
如需詳細資訊,請參閱動態語言執行階段概觀 (英文)http://i.msdn.microsoft.com/Hash/030c41d9079671d09a62d8e2c1db6973.gif


集合類別
新的 ISet<T> 介面是為集合 (Set) 的抽象而提供的。集合 (Set) 是具有唯一項目和特定作業的集合 (Collection)ISet<T> 是由目前可供 Silverlight 應用程式使用的 HashSet<T> 類別所實作。
Tuple
Silverlight 4 提供 Tuple 類別以建立包含結構化資料的 Tuple 物件。它也提供泛型 Tuple 類別,這些類別含有一至七個型別參數,用以表示單一、配對、三重、四重等 Tuple 物件。為了支援含 9 個以上部分的 Tuple 物件,有一個泛型 Tuple 類別會有 8 個參數,其中 7 個是使用型別的參數,第 8 個則為使用任何 Tuple 型別的參數。
剖析和格式化時間間隔
為了支援區分文化特性的格式功能,TimeSpan 結構現在會實作 IFormattable 介面,而且包含 ToStringParseTryParseParseExact  TryParsExact 方法的新多載。其格式化和剖析方法也都支援標準與自訂格式字串。
其他核心功能
下列清單說明已加入 Silverlight 的新功能與改進功能。在這些項目中,有幾種是根據客戶意見完成的。
·         新的 String.IsNullOrWhiteSpace 方法能夠指定字串是 null、空白還是只包含空白字元。新多載已加入至能夠串連 System.Collections.Generic.IEnumerable<T> 集合成員的 String.Concat  String.Join 方法。
·         String.Concat 方法可讓您不用先將項目轉換為字串,即可串連可列舉集合中的每個項目。
·         StringBuilder.Clear 方法使得清除 StringBuilder 執行個體的工作更為輕鬆。
·         新的 Enum.HasFlag 方法能夠判斷在列舉值中是否已設定一個或多個位元欄位或旗標。Enum.TryParse 方法會傳回布林值,表示是否能順利剖析字串或整數值。
·         信任的應用程式可以使用新的 Path.Combine 方法多載,讓您結合多個檔案路徑。
·         新的檔案列舉方法可以改善信任的應用程式在存取目錄或逐一查看大型檔案各行時的效能。只有 [我的文件] 底下的目錄和檔案才是可存取的。如需詳細資訊,請參閱 DirectoryDirectoryInfo  File 類別。
·         現在,您可以在 System.Lazy<T> 類別內包裝型別,藉此針對任一自訂型別啟用延遲初始化功能。
·         新的 Monitor.Enter(Object, Boolean) 方法多載採用布林參考,並且只有在已成功進入監視器時才會自動設為 true
·         System.Guid 結構現在包含 TryParse  TryParseExact 方法。


Visual Studio 2010 已經對設計工具做了各種改進,以便協助您建立 Silverlight 應用程式。在 Visual Studio 2008 中,針對 Silverlight 專案提供的設計工具支援有所限制。在 Visual Studio 2010 中,您現在可以完成一些工作,例如在設計介面上使用滑鼠來選取並放置項目,以及使用 [屬性] 視窗來設定屬性。 如需詳細資訊,請參閱 Silverlight Designer for Visual Studio 2010


Silverlight 目前在 Silverlight 社群技術預覽 (Community Technology PreviewCTP) 版本的 Windows Phone 7 Series 中有支援。如需詳細資訊,請參閱 Silverlight for Windows Phone  Windows Phone 開發 (英文)