Передача словаря в ObjectForScripting с помощью WPF WebBrowser
-
11-12-2019 - |
Вопрос
я использую 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
что мне не хватает?
Решение
Я не уверен, что вы подразумеваете под настраиваемым, но есть множество способов добиться того, чего вы хотите, например, создать оболочку для вашего словаря и использовать ее в качестве 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.