Pasar diccionario a ObjectForScripting con WPF WebBrowser
-
11-12-2019 - |
Pregunta
estoy usando un WebBrowser
componente en WPF para alojar algo de JavaScript + HTML y quiero poder pasar un objeto personalizable como ObjectForScripting
propiedad.Mi objetivo final es que el javascript que se ejecuta en el WebBrowser
puede llamar a algo como:
window.external['lookup'].getValue(someId);
Puedo lograr algo parecido a esto implementando una clase con ComVisible
ajustado a true
eso tiene un lookup
propiedad en él:
[ComVisible(true)]
public class ScriptingContext
{
public LookupService lookup { get; set; } //where LookupService is also ComVisible
}
Sin embargo, quiero ser flexible con respecto a los miembros del ObjectForScripting
que estoy pasando, por lo que no puedo especificar cuál será cada propiedad de antemano.
Lo ideal sería especificar un par nombre-objeto para pasar, pero de hecho esto no funciona.
Lo que he probado (y en lo que he fallado) hasta ahora:
- usando un
Dictionary<string,object>
como mi contexto - utilizando una extensión de
Dictionary<string,object>
que esta marcado comoComVisible
- usando un
ExpandoObject
- usando un
List<KeyValuePair<string,object>>
- utilizando una extensión de
List<KeyValuePair<string,object>>
que esta marcado comoComVisible
¿Hay alguna manera de pasar un personalizable? ObjectForScripting
en el WPF WebBrowser
que me falta?
Solución
No estoy seguro de lo que quieres decir con personalizable, pero hay muchas maneras de lograr lo que buscas, como crear un contenedor para tu diccionario y convertirlo en tu ObjectForScripting:
[ComVisible(true)]
public class ScriptingContext
{
private Dictionary<string, object> objectsForScripting;
public object GetValue(string s)
{
return objectsForScripting[s];
}
}
Con el javascript correspondiente window.external.GetValue("lookup").getValue(someId)
.
Tenga en cuenta que también puede pasar objetos ComVisible a JavaScript a través del método InvokeScript e interactuar con ellos de esa manera, usando algo como webBrowser.InvokeScript("RegisterProperty", "lookup", lookupObject)
y administrar los objetos que estás exponiendo en el lado de JavaScript.