wpf - 使用 WPF WebBrowser 将字典传递给 ObjectForScripting

标签 wpf webbrowser-control expandoobject comvisible

我正在使用WebBrowser WPF 中的组件来托管一些 JavaScript + HTML,我希望能够将可自定义的对象传递为 ObjectForScripting属性(property)。我的最终目标是在 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我失踪了吗?

最佳答案

我不确定你所说的可定制是什么意思,但是有很多方法可以实现你想要的,例如为你的字典构建一个包装器并将其作为你的 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 端公开的对象。

关于wpf - 使用 WPF WebBrowser 将字典传递给 ObjectForScripting,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10661112/

相关文章:

c# - 重新加载 RTF 后未检测到下划线

c# - 如何为此类DataGrid组织ItemSsource

.net - 如何在 WebBrowser Control 中设置当前 document.domain 以避免 "Access is denied"?

Selenium new Chrome 无法禁用浏览器通知(尝试过其他解决方案)

c# - MVVM 模式,我不明白我应该如何编写 "Detail"ViewModel

c# - 具有动态列和行的 DevExpress GridControl

.net - 如何检测双击 Web 浏览器控件?

c# - 我可以在 .NET 4 中序列化 ExpandoObject 吗?

c# - "Keyword ' 这个 ' is not valid in a static property, static method, or static field initializer"向 ExpandoObject 添加方法时

c# - 将与字符串同名的属性添加到 ExpandoObject