Pergunta

Estou criando um aplicativo Silverlight, que será fortemente javascripted contra.

Para ativar a interação JS, eu criei a seguinte 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 carregá-la no construtor da aplicação SL principal:

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

No entanto, como este é um aplicativo Javascript-pesado, ele deve ser carregável via javascript si.

i. algo 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();

}

No entanto, este aumento o erro porque agApp.Content.JsProxy não está disponível totalmente até o evento Silverlight onLoad é disparado, assim o campo JsProxy não está disponível.

Como posso permitir o acesso à classe JsProxy imediatamente como eu criar a instância Silverlight? Alguns alongs nada enquanto (_mutex); é provavelmente uma má idéia.

Eu tive que isso porque não haverá outra camada de abstração de construção na criação de instâncias de aplicativos Silverlight, de modo que a função deve sincronicamente carregar todos os conteúdos SL de uma vez.

Foi útil?

Solução

Isto é devido ao Silverlight e JavaScript estão operando em segmentos separados. Mesmo que você tenha solicitado o navegador para carregar o referido controle do Silverlight, não esperar em torno de Silverlight para o carregamento terminar antes de prosseguir para a próxima linha.

Você só pode acessar o Proxy JS após Silverlight tem instanciado-lo assim que você pode esperar para o evento OnLoad ao fogo (mas isso só será acionado depois de todo o Silverlight.xap é totalmente carregado) que ou depois de RegisterScriptableObject disparar um JavaScript método chamado onYourJSProxyNameLoaded () que irá colocá-lo de volta em linha com o fluxo de trabalho que você deseja.

HTH.

- Scott Barnes / Plataformas ricos Product Manager / Microsoft.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top