2012-05-18 29 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

    是的,这工作。有点惭愧我没有自己尝试 - 这就是我为深夜编码而得到的! –