Javascript / atraso de carga dupla procuração Silverlight
-
16-09-2019 - |
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.
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.