Domanda

Sto creando un'applicazione Silverlight che sarà pesantemente javascripted contro.

Per attivare l'interazione JS, ho creato la seguente classe SL:

[ScriptableType]
public class JavaScriptProxy
{
    private string _version;

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

E caricai sul costruttore dell'applicazione SL principale:

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

Tuttavia, poiché si tratta di un'applicazione Javascript-pesante, deve essere caricabile tramite JavaScript per sé.

vale a dire. qualcosa 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();

}

Tuttavia, questo solleva l'errore perché agApp.Content.JsProxy non è disponibile completamente fino a quando viene attivato l'evento onLoad Silverlight, così il campo JsProxy non è disponibile.

Come posso abilitare l'accesso alla classe JsProxy immediatamente come creo l'istanza di Silverlight? Alcuni alongs cosa, mentre (_mutex); è probabilmente una cattiva idea.

ho dovuto questo perché ci sarà un altro strato di astrazione edificio sulla creazione di istanze di applicazioni Silverlight, in modo che la funzione deve in modo sincrono caricare tutti i contenuti SL in una sola volta.

È stato utile?

Soluzione

Ciò è dovuto a Silverlight e JavaScript operano sui thread separati. Anche se hai richiesto il browser per caricare il detto controllo di Silverlight, non aspettare per Silverlight per completare il caricamento prima di procedere alla riga successiva.

È possibile accedere solo il JS Proxy dopo Silverlight è un'istanza in modo da poter attendere che l'evento OnLoad al fuoco (ma questo sarà solo il fuoco dopo che l'intero Silverlight.xap a pieno carico) che o dopo aver RegisterScriptableObject spara un JavaScript metodo chiamato onYourJSProxyNameLoaded () che vi metterà di nuovo in linea con il flusso di lavoro che desiderate.

HTH.

- Scott Barnes / piattaforme ricche Product Manager / Microsoft.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top