我正在创建一个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内容。
答案 0 :(得分:1)
这是因为Silverlight和JavaScript在单独的线程上运行。即使您已请求浏览器加载所述Silverlight控件,它也不会等待Silverlight完成加载,然后才能进入下一行。
您只能在Silverlight实例化后才能访问JS代理,这样您就可以等待OnLoad事件触发(但这只会在整个Silverlight.xap完全加载后触发)或在RegisterScriptableObject触发JavaScript之后触发调用onYourJSProxyNameLoaded()的方法,它将使您回到所需的工作流程内。
HTH。
- Scott Barnes / Rich Platforms产品经理/ Microsoft。