Question

Je suis en train de créer une application Silverlight qui sera fortement javascripted contre.

Pour activer l'interaction JS, j'ai créé la suivante classe SL:

[ScriptableType]
public class JavaScriptProxy
{
    private string _version;

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

Et chargé sur le constructeur de la principale application 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());
}

Cependant, comme cela est une application Javascript lourd, il doit être chargeable via javascript lui-même.

i.e.. alongs quelque chose:

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

}

Cependant, cette erreur, car augmenter le agApp.Content.JsProxy n'est pas disponible entièrement jusqu'à ce que l'événement onLoad Silverlight est tiré, donc le champ JsProxy est indisponible.

Comment puis-je autoriser l'accès à la classe JsProxy immédiatement que je crée l'instance Silverlight? Quelque chose alongs while (_mutex); est probablement une mauvaise idée.

Je devais cela parce qu'il y aura une autre couche de construction d'abstraction sur la création d'instances d'applications Silverlight, de sorte que la fonction doit charger tout le contenu de manière synchrone SL en une seule fois.

Était-ce utile?

La solution

Ceci est dû à Silverlight et JavaScript fonctionnent sur des fils séparés. Même si vous avez demandé au navigateur de charger ledit contrôle Silverlight, il n'attend pas pour Silverlight pour terminer le chargement avant de procéder à la ligne suivante.

Vous ne pouvez accéder à la JS Proxy après Silverlight a instancié de sorte que vous pouvez soit attendre l'événement OnLoad au feu (mais cela ne fera que le feu après que l'ensemble Silverlight.xap est complètement chargé) que ou après RegisterScriptableObject le feu d'un script JavaScript méthode appelée onYourJSProxyNameLoaded () qui vous remettre en ligne avec le flux de travail que vous désirez.

HTH.

- Scott Barnes / Plates-formes Rich Product Manager / Microsoft.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top