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 como ComVisible
  • usando un ExpandoObject
  • usando un List<KeyValuePair<string,object>>
  • utilizando una extensión de List<KeyValuePair<string,object>> que esta marcado como ComVisible

¿Hay alguna manera de pasar un personalizable? ObjectForScripting en el WPF WebBrowser que me falta?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top