Silverlight Interop 5-列出ScriptObject的所有屬性

ScriptObject提供了GetProperty, SetProperty可以讀取及修改屬性,但是獨缺for (var p in obj)的做法一口氣列出Javascript物件所有的屬性及方法。

原本有個構想,Sivlerlight Method在承接Javascript傳來參數時,想學習jQuery利用object傳遞即興組合參數設定的寫法,例如:

$("#dvX").css({ position:"absolute", left:"2px", top:"100px", width:"200px" });

只是,即便Silverlight端用ScriptObject接下傳入的參數,若無法透過列舉方法找出其中有哪些屬性,一樣無法發揮Javascript端的隨性與彈性。

先前jssk_IsFunction的做法給了啟示示,Javascript擅長的事還是可以交給Javascript來做,這才符合"閃開! 讓專業的來"之終極奧義:

        public string[] GetProperties(ScriptObject obj)
        {
            string script = @"
if (window.jssk_ListProperties == undefined) 
    window.jssk_ListProperties = function(obj) {
        var a = [];
        for (var p in obj) 
            if (typeof(obj[p]) != 'function')
                a.push(p);
        return a;
    }
";
            HtmlPage.Window.Eval(script);
            return ((ScriptObject)HtmlPage.Window.Invoke(
                "jssk_ListProperties", obj))
                .ConvertTo<string[]>();
        }

很簡單吧!

歡迎推文分享:
Published 05 May 2010 08:55 AM 由 Jeffrey
Filed under: ,
Views: 9,738



意見

# Asimo said on 09 May, 2010 02:54 AM

您好,不好意思請教個問題

當執行到HtmlPage.Window.Eval(script);該行,

我會出現 "這項作業只能發生在 UI 執行緒上" 錯誤訊息,

因為我是想將script裡的內容

直接丟到html上給JavaScript去處理,

沒有任何silverlight的UI去接,

請問一下我該怎麼解決?!感恩

# Asimo said on 09 May, 2010 02:55 AM

您好,不好意思請教個問題

當執行到HtmlPage.Window.Eval(script);該行,

我會出現 "這項作業只能發生在 UI 執行緒上" 錯誤訊息,

因為我是想將script裡的內容

直接丟到html上給JavaScript去處理,

沒有任何silverlight的UI去接,

請問一下我該怎麼解決?!感恩

# Jeffrey said on 09 May, 2010 08:39 AM

to Asimo, 你的HtmlPage.Window.Eval是否以其他執行緒執行? 若是,可參考http://bit.ly/c9ZhFu ,用Dispatcher.BeginInvoke技巧克服。(HtmlPage.Window.Dispatcher.BeginInvoke)

# Asimo said on 09 May, 2010 09:31 AM

嗯 是在其他執行緒執行 也試了一下您提供的方法,

HtmlPage.Window.Dispatcher.BeginInvoke(() => HtmlPage.Window.Eval(script));

一樣會出現"這項作業只能發生在 UI 執行緒上" 錯誤訊息,

應該是判斷到HtmlPage.Window.Eval就會跳出訊息,

還是說Dispatcher.BeginInvoke的另一個執行緒也不是UI執行緒?,

# Jeffrey said on 09 May, 2010 11:48 PM

to Asimo, 先前HtmlPage.Window寫法有誤,請參考以下範例: (用UserControl.Dispatcher.BeginInvoke())

   public partial class MainPage : UserControl

   {

       public MainPage()

       {

           InitializeComponent();

           if (HtmlPage.IsEnabled)

           {

               HtmlPage.RegisterScriptableObject(

                   "JavascriptSidekick", this);

           }

       }

       [ScriptableMember]

       public void ThreadTest()

       {

           ThreadPool.QueueUserWorkItem((o) =>

           {

               Dispatcher.BeginInvoke(() =>

               {

                   HtmlPage.Window.Eval("alert('YES');");

               });

           });

       }

   }

你的看法呢?

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

5 + 3 =

搜尋

Go

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

Tags 分類檢視
關於作者

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

文章典藏
其他功能

這個部落格


Syndication