質問

私は重くに対してjavascriptedされるSilverlightアプリケーションを作成しています。

JSとの対話を可能にするために、私は次のSLクラスを作成しています:

[ScriptableType]
public class JavaScriptProxy
{
    private string _version;

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

そしてメイン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());
}
これはJavascriptを多用アプリですと

しかし、それはjavascriptを自分自身を経由してロード可能でなければなりません。

すなわち。何かアロングます:

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

}
agApp.Content.JsProxyが利用できないため、

しかし、これはSilverlightのonLoadイベントが発射されるまで完全に、これJsProxyフィールドが使用できないエラーが発生します。

どのように私はJsProxyクラスへのアクセスを可能にすることができます。の直後にの私は、Silverlightのインスタンスを作成すると?ながら、いくつかの事アロング(_mutex)。おそらく悪い考えです。

その関数が同期一度にすべてのSLの内容をロードしなければならないので、Silverlightのアプリインスタンスの作成時に抽象建物の別の層が存在しますので、私はこれまで持っていた。

役に立ちましたか?

解決

これは、SilverlightとJavaScriptが別々のスレッド上で動作しているためです。あなたが言ったSilverlightコントロールをロードするようにブラウザを要求したにも関わらず、それが次の行に進む、それがロードを完了するためにSilverlightのために周りに待機しません。

それか、JavaScriptを発射するRegisterScriptableObjectした後、あなたが火にOnLoadイベントを待つことができますいずれかのように、Silverlightのは、それをインスタンス化している(しかし、全体Silverlight.xapが完全にロードされ、これが唯一の火災の意志後)の後に

あなただけのJSプロキシにアクセスすることができますあなたが望むワークフローにインラインバックあなたを配置しますonYourJSProxyNameLoaded()と呼ばれる手法ます。

HTHます。

- スコットバーンズ/リッチプラットフォームプロダクトマネージャー/マイクロソフトます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top