我创建这将在很大程度上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。

- 斯科特·巴恩斯/富平台产品经理/微软。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top