使用Javascript / Silverlight的代理双加载延迟
-
16-09-2019 - |
题
我创建这将在很大程度上javascripted针对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本身装载。
即。东西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字段不可用。
我怎样才能使访问JsProxy类的立即的为我创建Silverlight的实例?有些事情alongs而(_mutex);可能是一个坏主意。
我不得不这样,因为会有对创建Silverlight应用程序实例的抽象建筑的另一层,使功能必须同步加载在一个全力以赴SL内容。
解决方案
这是由于Silverlight的和JavaScript上单独的线程操作。即使您请求的浏览器加载表示Silverlight控件,它不会等待周围Silverlight来完成加载进到下一行之前。
Silverlight有实例化之后,所以你可以等待在onload事件触发(但这只会对整个Silverlight.xap后火被完全加载),您只能访问JS代理或之后RegisterScriptableObject火一个JavaScript方法称为onYourJSProxyNameLoaded(),这将让您重新内嵌您想要的工作流程。
HTH。
- 斯科特·巴恩斯/富平台产品经理/微软。
不隶属于 StackOverflow