2

WebBrowser在 WPF 中使用一个组件来托管一些 JavaScript + HTML,并且我希望能够将可自定义的对象作为ObjectForScripting属性传递。我的最终目标是运行在 javascript 中的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传入的成员保持灵活,因此我无法事先指定每个属性是什么。

理想情况下,我只想指定一个名称-对象对来传递,但这不起作用。

到目前为止我已经尝试过(但失败了):

  • 使用 aDictionary<string,object>作为我的上下文
  • 使用的扩展Dictionary<string,object>被标记为ComVisible
  • 使用ExpandoObject
  • 用一个List<KeyValuePair<string,object>>
  • 使用的扩展 List<KeyValuePair<string,object>>被标记为ComVisible

有什么方法可以将可自定义的内容传递到我缺少ObjectForScripting的 WPF中吗?WebBrowser

4

1 回答 1

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 端公开的对象。

于 2012-05-19T00:34:33.910 回答