Передача словаря в 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.