2010-12-23 146 views
2

我正在爲現有的Flash客戶端開發Silverlight4插件替代品。我想保持兼容性與現有的Flash HTML橋JavaScript函數,但我不知道如何直接在Silverlight客戶端對象而不是包含的對象公開JavaScript接口。Silverlight和Flash JavaScript橋兼容性

在Flash中,就可以直接調用bar()的客戶對象上,如:

var flashClient = document.GetElementById(_currentFlashId); 
flashClient.Bar(); 

但在Silverlight中,我還沒有發現直接在Silverlight中調用接口的手段目的。相反,它似乎接口只能包含對象暴露出來,如:

var silverlightClient = document.GetElementById(_currentSilverlightId); 
silverlightClient.Foo.Bar(); 

如果上面的「富」目標似乎是必需的,因爲

RegisterScriptableObject("Foo", MyFooObject); 

無法與被調用空的第一個參數。

因此,在Silverlight中,有沒有什麼辦法,只是剛:

silverlightClient.Bar(); 

+0

如果你想在Javascript中訪問,你不會註冊App對象作爲腳本對象嗎? – PilotBob 2010-12-28 19:10:25

回答

1

如果你只是想一個對象,具有兼容的接口,你可能只是這樣做:

var silverlightClient = document.GetElementById(_currentSilverlightId).Foo; 
0

有一點這樣做(我在同樣情況下的勞神費力的方法 - - 試圖放棄直接Silverlight替換Flash應用程序)。

void BackBind(string methodName, int argCount) { 
    var id = HtmlPage.Plugin.Id; 
    var sb = new StringBuilder(); 
    sb.Append("var x = document.getElementById('"); 
    sb.Append(id); 
    sb.Append("'); x."); 
    sb.Append(methodName); 
    sb.Append(" = function("); 

    for (int i = 0; i < argCount; i++) { 
     if (i > 0) sb.Append(','); 
     sb.Append((char)('A' + i)); // if you have more than 26 arguments, improve this! 
    } 

    sb.Append("){return x.content."); 
    sb.Append(ScriptRegistration); 
    sb.Append("."); 
    sb.Append(methodName); 
    sb.Append("("); 

    for (int i = 0; i < argCount; i++) { 
     if (i > 0) sb.Append(','); 
     sb.Append((char)('A' + i)); // if you have more than 26 arguments, improve this! 
    } 

    sb.Append(");};"); 
    HtmlPage.Window.Eval(sb.ToString()); 
    // calls something like: var x = document.getElementById('my_id'); x.Bar = function(a,b){return x.content.Foo.Bar(a,b);}; 
} 

用例::

對於每個[ScriptableMember],主叫HtmlPage.RegisterScriptableObject("Foo", MyFooObject);

BackBind方法後調用BackBind方法,具有的參數

public class MyFooObject { 
    const string ScriptRegistration = "Foo"; 
    public MyFooObject() { 
     HtmlPage.RegisterScriptableObject(ScriptRegistration, this); 
     BackBind("Bar", 2); 
     BackBind("Baz", 0); 
    } 

    [ScriptableMember] 
    public void Bar(string a, int b) { /* stuff */ } 

    [ScriptableMember] 
    public string Baz() { return "stuff"; } 
} 

希望有所幫助!