سؤال

أنا أقوم بإنشاء تطبيق 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)؛ ربما فكرة سيئة.

اضطررت إلى ذلك لأنه سيكون هناك طبقة أخرى من بناء التجريد على إنشاء مثيلات تطبيق Silverlight، بحيث يجب أن تعمل هذه الوظيفة بشكل متزامن جميع محتويات SL في One Go.

هل كانت مفيدة؟

المحلول

هذا بسبب Silverlight و JavaScript تعمل على خيوط منفصلة. على الرغم من أنك طلبت من المتصفح تحميل عنصر تحكم Silverlight Silverlight، إلا أنه لا تنتظر حول Silverlight لإنهاء التحميل قبل أن يتابع السطر التالي.

يمكنك الوصول فقط إلى وكيل JS بعد إنشاء مثيل له Silverlight حتى تتمكن من الانتظار حتى ينتظر الحدث Onload (ولكن هذا لن ينطلق إلا بعد تحميل SilverLight.xap بالكامل) أنه أو بعد التسجيل CriepcriptableBject () والتي سوف تضعك مرة أخرى بما في سير العمل الذي تريده.

هث.

- سكوت بارنز / المنصات الغنية مدير المنتج / مايكروسوفت.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top