Javascript / Silverlight代理双重加载延迟

时间:2009-04-27 08:37:22

标签: javascript silverlight silverlight-2.0

我正在创建一个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本身加载。

即。什么东西:

// 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 个答案:

答案 0 :(得分:1)

这是因为Silverlight和JavaScript在单独的线程上运行。即使您已请求浏览器加载所述Silverlight控件,它也不会等待Silverlight完成加载,然后才能进入下一行。

您只能在Silverlight实例化后才能访问JS代理,这样您就可以等待OnLoad事件触发(但这只会在整个Silverlight.xap完全加载后触发)或在RegisterScriptableObject触发JavaScript之后触发调用onYourJSProxyNameLoaded()的方法,它将使您回到所需的工作流程内。

HTH。

- Scott Barnes / Rich Platforms产品经理/ Microsoft。