Passando Dicionário para ObjectForScripting com o WPF WebBrowser
-
11-12-2019 - |
Pergunta
Eu estou usando um WebBrowser
componente no WPF para hospedar um pouco de JavaScript + HTML e eu quero ser capaz de passar um personalizável objeto como o ObjectForScripting
propriedade.Meu objetivo final é que o javascript em execução no WebBrowser
pode chamar algo como:
window.external['lookup'].getValue(someId);
Que eu possa alcançar algo próximo a isso implementando uma classe com ComVisible
conjunto para true
que tem um lookup
propriedade:
[ComVisible(true)]
public class ScriptingContext
{
public LookupService lookup { get; set; } //where LookupService is also ComVisible
}
No entanto, eu quero ser flexível sobre os membros do ObjectForScripting
que estou passando, então eu não posso especificar o que cada propriedade será de antemão.
Idealmente, eu gostaria apenas de especificar um nome de objeto de par para passar, mas afaict isto não funciona.
O que eu tentei (e não com) até agora:
- usando um
Dictionary<string,object>
como meu contexto - usando uma extensão de
Dictionary<string,object>
que é marcada comoComVisible
- usando um
ExpandoObject
- usando um
List<KeyValuePair<string,object>>
- usando uma extensão de
List<KeyValuePair<string,object>>
que é marcada comoComVisible
Existe alguma maneira de passar um personalizável ObjectForScripting
no WPF WebBrowser
que eu estou ausente?
Solução
Eu não tenho certeza do que você quer dizer com personalizável, mas há muitas maneiras de realizar o que você está indo para, tais como a construção de um wrapper para o dicionário e ter que ser o seu ObjectForScripting:
[ComVisible(true)]
public class ScriptingContext
{
private Dictionary<string, object> objectsForScripting;
public object GetValue(string s)
{
return objectsForScripting[s];
}
}
Com o javascript correspondente window.external.GetValue("lookup").getValue(someId)
.
Observe que você também pode passar ComVisible objetos javascript através do InvokeScript método e interagir com eles de que maneira, usando algo como webBrowser.InvokeScript("RegisterProperty", "lookup", lookupObject)
e gerenciar os objetos que você está expondo no javascript do lado.