Pregunta

Estoy creando una aplicación de Silverlight que será fuertemente contra javascripted.

Para permitir la interacción JS, he creado la siguiente clase SL:

[ScriptableType]
public class JavaScriptProxy
{
    private string _version;

    // provided for testing SL-JS integration
    [ScriptableMember]
    public void SmokeTest() { HtmlPage.Window.Alert("Hello world!"); }
}

Y lo cargó en el constructor de la aplicación principal 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());
}

Sin embargo, como se trata de una aplicación Javascript-pesado, tiene que ser a través de JavaScript que puede cargarse en sí.

es decir. algo a coro:

// 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();

}

Sin embargo, este aumento del error porque agApp.Content.JsProxy no está disponible por completo hasta que se dispara el evento onLoad Silverlight, así el campo JsProxy no está disponible.

¿Cómo puedo permitir el acceso a la clase JsProxy inmediatamente como puedo crear la instancia de Silverlight? Algo a coro mientras _mutex (); es probablemente una mala idea.

he tenido que esto porque no habrá otra capa de abstracción de la construcción en la creación de instancias de aplicaciones de Silverlight, por lo que la función debe cargar todos los contenidos de forma sincrónica SL de una sola vez.

¿Fue útil?

Solución

Esto es debido a Silverlight y Javascript están operando en hilos separados. A pesar de que ha solicitado el navegador para cargar dicho control de Silverlight, no esperar a que se termine de cargar Silverlight antes de proceder a la siguiente línea.

Sólo se puede acceder al proxy JS después de Silverlight ha instanciado que por lo que puede esperar a que el evento onLoad al fuego (pero esto sólo se disparará después de todo el Silverlight.xap está totalmente cargado) que o después de disparar un RegisterScriptableObject JavaScript método llamado onYourJSProxyNameLoaded () que se pondrá de nuevo en línea con el flujo de trabajo que desea.

HTH.

- Scott Barnes / Plataformas ricos de producción / Microsoft.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top