(轉)Silverlight 與 JS交互

 

轉自 http://www.cnblogs.com/wt616/archive/2011/10/08/2201987.htmlhtml

一、Silverlight直接調用JS的函數:函數

這個很簡單,只要在HTML中定義好JS函數,而後在Silverlight中調用:HtmlPage.Window.Invoke("函數名",para1,para2...);便可。post

其中第一個參數爲string型的函數名,與JS中的函數要一致,後面的爲參數,取決於JS中函數的定義。spa

二、JS中引用Siverlight的對象(C#對象),並獲取對象的屬性、調用對象的函數:code

思路爲:定義C#對象——》實例化對象——》將實例以某一個ID做爲Key註冊到JS中——》JS載入時須要獲取Silverlight的Host,其中包含了全部由C#註冊的對象實例,憑藉ID獲取便可。htm

注意:須要對JS暴露的函數或者屬性前,要標記[ScriptableMemberAttribute]屬性,若是想偷懶,能夠直接在類頭標記[ScriptableType]屬性對象

例:blog

  一、定義C#對象:ip

複製代碼
     [ScriptableType]
public class MyJSClass
{
      private string[] list;
            public MyJSClass()
{
list = new string[10];
for (int i = 0; i < list.Length; i++)

{
list[i] = "wangtao" + i;
}
}

//[ScriptableMemberAttribute]
public int Length
{
get
{
return list.Length;
}
}

[ScriptableMemberAttribute]
public string getStr(int index)
{
return list[index];
}
}
複製代碼

二、實例化,並註冊:ci

HtmlPage.RegisterScriptableObject( "abc" , new MyJSClass());

  這裏abc就是ID,在JS代碼中必須根據這個ID來找到對象實例。

三、JS載入時須要獲取Silverlight的Host

  在JS中定義一個全局變量:

  var control = null;這個是對Silverlight宿主的引用,由於可能多個JS函數都要用到它,因此做爲全局變量。

  在HTML中,找到<object></object>標記對,添加一個param:

    (本身試驗是在aspx頁面添加纔好使)

  <param name="onLoad" value="plugInLoaded"/>

  並在JS部分添加對應的載入函數:

  

複製代碼
 function plugInLoaded(sender, args) {
control = sender.getHost();//獲取宿主
try {
var i = 0;
var len = control.Content.abc.Length;
var result = null;
var str = "";
for (i = 0; i < len; i++ ) {
result = control.Content.abc.getStr(i);
str += result + "\n";
}
alert(str);
}
catch (e) {
alert(e);
}
}
複製代碼

這個例子中,我在載入頁面後,獲取了宿主,並馬上調用了C#對象實例,通常狀況下,只需保留 「control = sender.getHost();//獲取宿主」 便可,至於C#對象則等到須要調用的JS函數中使用便可。

這樣,經過上述的方法,能夠無縫實現Silverlight調用JS和JS調用C#對象了,許多JS有而Silverlight沒有的功能就能夠利用這點來實現了。

相關文章
相關標籤/搜索