2009-04-27 38 views
1

我正在創建一個Silverlight應用程序,該應用程序將嚴重依賴javascripted。Javascript/Silverlight代理雙加載延遲

要啓用JS的互動,我創建了以下SL類:

[ScriptableType] 
public class JavaScriptProxy 
{ 
    private string _version; 

    // provided for testing SL-JS integration 
    [ScriptableMember] 
    public void SmokeTest() { HtmlPage.Window.Alert("Hello world!"); } 
} 

並加載它的主要SL應用程序的構造函數:

public App() 
{ 
    this.Startup += this.onStartup; 
    this.Exit += this.Application_Exit; 
    this.UnhandledException += this.Application_UnhandledException; 

    InitializeComponent(); 

    // register javascript bridge proxy 
    // (must register in constructor so proxy is available immediatly) 
    HtmlPage.RegisterScriptableObject("JsProxy", new JavaScriptProxy()); 
} 

然而,由於這是一個Javascript - 重型應用程序,它必須通過javascript本身加載。

I.e.東西alongs:

// called on body.onLoad 
function init() { 

    var proxy; 

    var el = document.getElementById("target_canvas"); 

    Silverlight.createObject(..., el, "agApp" ..., { 

     onLoad: function() { 
      proxy = agApp.Content.JsProxy; 

      // ***this line is ok*** 
      proxy.SmokeTest(); 
     } 

    });   

    // ***this line fails (of course)*** 
    proxy.SmokeTest(); 

} 

然而,這是因爲agApp.Content.JsProxy不可完全直到Silverlight的onLoad事件被觸發,因此JsProxy字段不可引發錯誤。

當我創建Silverlight實例時,如何才能立即訪問JsProxy類? (_mutex);可能是一個壞主意。

我不得不這樣做,因爲在創建Silverlight應用程序實例時會有另一層抽象,因此函數必須一次同步加載所有SL內容。

回答

1

這是由於Silverlight和JavaScript在單獨的線程上運行。儘管您已經請求瀏覽器加載所述Silverlight控件,但它不會等待Silverlight完成加載,然後才能繼續下一行。

您只能在Silverlight實例化後訪問JS代理,以便您可以等待OnLoad事件觸發(但只有在整個Silverlight.xap完全加載後纔會觸發),或者您在RegisterScriptableObject觸發後稱爲onYourJSProxyNameLoaded()的JavaScript方法,它可以讓你重新與你想要的工作流程內聯。

HTH。

- Scott Barnes/Rich Platforms產品經理/ Microsoft。