我正在使用一个 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 端公开的对象。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top