Frage

Ich bin eine Silverlight-Anwendung zu schaffen, die gegen stark javascripted wird.

JS Interaktion zu aktivieren, ich habe folgende SL-Klasse erstellt:

[ScriptableType]
public class JavaScriptProxy
{
    private string _version;

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

Und lud es auf den Konstruktor der Haupt SL Anwendung:

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

Da dies jedoch ein Javascript-heavy-App ist, muss es über JavaScript selbst belastbar sein.

d. etwas 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();

}

Dies ist jedoch die Fehler aus, weil agApp.Content.JsProxy nicht verfügbar ist voll, bis die Silverlight onLoad Ereignis ausgelöst wird, so dass das JsProxy Feld nicht verfügbar ist.

Wie kann ich Zugriff auf die JsProxy Klasse ermöglichen sofort , wie ich die Silverlight-Instanz erstellen? Einige Sache alongs während (_mutex); wahrscheinlich eine schlechte Idee ist.

ich dazu hatte, weil es eine weitere Abstraktionsebene Gebäude auf der Erstellung von Silverlight-Anwendung Instanzen, so dass Funktion synchron alle SL Inhalt in einem Rutsch laden muss.

War es hilfreich?

Lösung

Dies ist auf Silverlight und JavaScript sind auf separate Threads arbeiten. Auch wenn Sie den Browser angefordert haben, die das Silverlight-Steuerelement zu laden, ist es nicht für Silverlight warten, um Laden zu beenden, bevor es in der nächsten Zeile geht.

Sie können nur den JS Proxy zugreifen, nachdem Silver es instanziiert hat, so können Sie entweder warten, bis das OnLoad-Ereignis ausgelöst (aber dies wird nur Feuer, nachdem die gesamte Silverlight.xap vollständig geladen ist), dass oder nach RegisterScriptableObject Feuer ein JavaScript Verfahren onYourJSProxyNameLoaded (), die Sie inline setzen mit dem Workflow genannt Sie wünschen.

HTH.

- Scott Barnes / Rich-Plattformen Product Manager / Microsoft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top