使用 WPF WebBrowser 将字典传递给 ObjectForScripting
-
11-12-2019 - |
题
我正在使用一个 WebBrowser
WPF 中的组件来托管一些 JavaScript + HTML,我希望能够传递一个可自定义的对象作为 ObjectForScripting
财产。我的最终目标是运行在 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
我正在传递,所以我无法事先指定每个属性是什么。
理想情况下,我只想指定要传入的名称-对象对,但事实证明这是行不通的。
到目前为止我已经尝试过(但失败了):
- 用一个
Dictionary<string,object>
作为我的背景 - 使用扩展
Dictionary<string,object>
被标记为ComVisible
- 使用一个
ExpandoObject
- 用一个
List<KeyValuePair<string,object>>
- 使用扩展
List<KeyValuePair<string,object>>
被标记为ComVisible
有什么方法可以传递可定制的 ObjectForScripting
进入WPF WebBrowser
我失踪了?
解决方案
我不确定你所说的可定制是什么意思,但是有很多方法可以实现你想要的,例如为你的字典构建一个包装器并将其作为你的 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 端公开的对象。
不隶属于 StackOverflow