我在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
?
答案 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端公开的对象。