代码之家  ›  专栏  ›  技术社区  ›  chakrit Dutchie432

Javascript/Silverlight代理双加载延迟

  •  1
  • chakrit Dutchie432  · 技术社区  · 15 年前

    我正在创建一个Silverlight应用程序,它将被大量的Java脚本化。

    [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字段不可用。

    如何启用对JsProxy类的访问 立即 当我创建Silverlight实例时?有些东西一直存在(互斥);这可能是个坏主意。

    1 回复  |  直到 15 年前
        1
  •  1
  •   Scott    15 年前

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

    您只能在Silverlight实例化JS代理后才能访问它,因此您可以等待OnLoad事件触发(但这将仅在整个Silverlight.xap完全加载后触发),或者在RegisterScriptableObject触发名为onYourJSProxyNameLoaded()的JavaScript方法后触发这将使您重新与所需的工作流保持一致。

    嗯。

    - Scott Barnes/富平台产品经理/微软。

    推荐文章