最近在做Silverlight應用,需要用Silverlight調用頁面中JAVAscript方法。這個JS方法返回一個物件陣列給Silverlight。對於這個物件陣列怎麼在Silverlight裡處理這個問題糾結了一陣子,通過搜索,在微軟開發者社區裡找到了方法。
測試用的JS方法如下:
1: function test() {
2: var testObjectCollection = [];
3: for (var i = 0; i < 10; i++) {
4: var testObject = new Object();
5: testObject.Field1 = "Field1_" + i;
6: testObject.Field2 = "Field2_" + i;
7: testObjectCollection[testObjectCollection.length] = testObject;
8: }
9: return testObjectCollection;
10: };
代碼中設計了一個物件testObject,物件包含兩個屬性Field1和Field2。因此會很容易想到在Silverlight也創建一個結構相同的類:
1: public class TestObject
2: {
3: public string Field1 { get; set; }
4: public string Field2 { get; set; }
5: }
準備工作到這裡結束。

 

在Silverlight裡調用JS方法的代碼如下:
1: object returnedValue = HtmlPage.Window.Invoke("test", null);
第一個參數是JS方法名,第二個參數是params object[]類型的,是JS方法的參數清單。Invoke方法傳回值的是object類型,很容易想到會用下面的方法轉換:
1: List<TestObject> testObjectCollection = returnedValue as List<TestObject>;
但是會發現testObjectCollection變數是null,而returnedValue並不為null,轉換失敗了。

 

通過調試發現,returnedValue類型為System.Windows.Browser.ScriptObject,也就是說Invoke方法傳回值實際上是不單純是個object,而是ScriptObject。ScriptObject類有個ConvertTo方法可以用來轉換。關於System.Windows.Browser.ScriptObject類型詳細資訊,可以去查MSDN。
於是我嘗試如下方法:
1: ScriptObject returnedValue = HtmlPage.Window.Invoke("test", null) as ScriptObject;
2: List<TestObject> objects = returnedValue.ConvertTo<List<TestObject>>();
調試結果如下:

1032295432-1  

很明顯,轉換成功了。剩下的事情就是按業務需求來處理了。
創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()