Передача словаря в ObjectForScripting с WPF WebBrowser

Я использую WebBrowser компонент в WPF для размещения некоторого JavaScript + HTML, и я хочу иметь возможность передавать настраиваемый объект в качестве ObjectForScripting имущество. Моя конечная цель заключается в том, чтобы JavaScript работал в 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 что мне не хватает?

1 ответ

Решение

Я не уверен, что вы подразумеваете под настраиваемым, но есть много способов выполнить то, что вы собираетесь, например, создать обертку для вашего словаря и сделать это вашим 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),

Обратите внимание, что вы также можете передавать объекты ComVisible в javascript через метод InvokeScript и взаимодействовать с ними таким образом, используя что-то вроде webBrowser.InvokeScript("RegisterProperty", "lookup", lookupObject) и управлять объектами, которые вы выставляете на стороне javascript.

Другие вопросы по тегам