使用WPF WebBrowser将Dictionary传递给ObjectForScripting

时间:2012-05-18 23:52:05

标签: wpf webbrowser-control expandoobject comvisible

我在WPF中使用WebBrowser组件来托管一些JavaScript + HTML,我希望能够将可自定义的对象作为ObjectForScripting属性传递。我的最终目标是在WebBrowser中运行的javascript可以调用类似:

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

通过将ComVisible设置为true且具有lookup属性的类实现,我可以实现与此接近的目标:

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

但是,我希望对我传递的ObjectForScripting上的成员保持灵活性,因此我无法事先说明每个属性的内容。

理想情况下,我想指定要传入的名称 - 对象对,但是这不起作用。

到目前为止,我尝试过(并失败了):

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

有没有办法将可自定义的ObjectForScripting传递给我错过的WPF WebBrowser

1 个答案:

答案 0 :(得分: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端公开的对象。