2012-05-18 51 views
2

我在WPF中使用WebBrowser組件來承載一些JavaScript + HTML,我希望能夠通過一個可定製的對象作爲ObjectForScripting屬性。我的最終目標是,JavaScript中的WebBrowser運行可以調用類似:傳遞字典到ObjectForScripting與WPF WebBrowser

window.external['lookup'].getValue(someId); 

我可以通過實現與ComVisible設置一個類實現了接近這true在其上有一個lookup屬性:

[ComVisible(true)] 
public class ScriptingContext 
{ 
    public LookupService lookup { get; set; } //where LookupService is also ComVisible 
} 

但是,我想靈活處理我傳入的ObjectForScripting上的成員,所以我無法事先指定每個屬性。

理想情況下,我想指定一個名稱 - 對象傳入,但afaict這不起作用。

我試圖(和失敗的)到目前爲止:使用Dictionary<string,object>作爲我的上下文

    • 使用Dictionary<string,object>擴展標記爲ComVisible
    • 使用ExpandoObject
    • 使用List<KeyValuePair<string,object>>
    • 使用標記爲ComVisible的擴展名List<KeyValuePair<string,object>>

    有沒有辦法將可定製的ObjectForScripting傳遞到WPF WebBrowser我缺少的東西?

  • 回答

    2

    我不知道你定製的意思,但有很多的方式來完成你要什麼,比如建立一個包裝爲你的字典,並具有成爲你ObjectForScripting:

    [ComVisible(true)] 
    public class ScriptingContext 
    { 
        private Dictionary<string, object> objectsForScripting; 
        public object GetValue(string s) 
        { 
         return objectsForScripting[s]; 
        } 
    } 
    

    與相應的javascript window.external.GetValue("lookup").getValue(someId)

    請注意,您還可以通過InvokeScript方法將ComVisible對象傳遞給JavaScript,並使用類似webBrowser.InvokeScript("RegisterProperty", "lookup", lookupObject)這樣的方式與它們進行交互,並管理您在javascript方面公開的對象。

    +0

    是的,這工作。有點慚愧我沒有自己嘗試 - 這就是我爲深夜編碼而得到的! –