Silverlight Interop 3-傳入Javascript Function供Silverlight呼叫

在jQuery中,我們常會傳入匿名函數當作參數,供後續某些事件發生時呼叫。例如:

$("#btnOK").click(function() { alert("OK"); });

那麼,我們由Javascript端呼叫Silverlight的Method時,是否也能傳入匿名函數,請Silverlight在稍後呼叫? 做法很簡單,用ScriptObject承接傳入的匿名Function,接著呼叫ScriptObject.InvokeSelf就可以囉!

如果想多一點,InvokeSelf時並不會檢查ScriptObject本身是否為Javascript Function,若否,則會發生InvalidOperationException。針對傳入參數非Function的問題,我們可以用try { ... } catch (InvalidOperationException ex) { ... }的寫法來解決。

在以下範例中,則再積極一些,在傳入參數時就檢查! 利用HmltPage.Window.Eval,我們可在Javascript端建立共用的jssk_IsFunction(obj)用來檢測某物件是否為Function,接著以HtmlPage.Window.Invoke將傳入參數送給jssk_IsFunction檢測。

程式碼如下:

    public class JavascriptSidekick
    {
        public bool IsFunction(ScriptObject obj)
        {
            string script = @"
if (window.jssk_IsFunction == undefined) 
    window.jssk_IsFunction = function(obj) {
    return Object.prototype.toString.call(obj) === '[object Function]';
    }
";
            HtmlPage.Window.Eval(script);
            return (bool)HtmlPage.Window.Invoke("jssk_IsFunction", obj);
        }
        [ScriptableMember]
        public void CallbackTest(ScriptObject cb)
        {
            if (IsFunction(cb))
            {
                Thread.Sleep(5000);
                cb.InvokeSelf("Darkthread");
            }
            else
                HtmlPage.Window.Alert(cb.Invoke("toString").ToString() +
                    " is not a function!");
        }
    }

Javascript端則是:

function onSilverlightLoad(sender, args) {
    var slCtl = sender.getHost();
    var jssk = slCtl.Content.JavascriptSidekick;
    jssk.CallbackTest(function(name) { 
        alert("Hello, " + name); 
    });
    jssk.CallbackTest({ name:"Blah" });
    jssk.CallbackTest(["AAA"]);
}

其中傳入物件及字串陣列時,分別會得到[object Object] is not a function!、AAA is not a function!

歡迎推文分享:
Published 01 May 2010 10:22 AM 由 Jeffrey
Filed under: ,
Views: 8,065



意見

沒有意見

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<May 2010>
SunMonTueWedThuFriSat
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345
 
RSS
創用 CC 授權條款
【廣告】
twMVC

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication