2009-04-27 67 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。