Question

J'utilise un WebBrowser composant dans WPF pour héberger du JavaScript + HTML et je souhaite pouvoir transmettre un objet personnalisable en tant que ObjectForScripting propriété.Mon objectif final est que le javascript exécuté dans le WebBrowser peut appeler quelque chose comme :

window.external['lookup'].getValue(someId);

Je peux réaliser quelque chose de proche en implémentant une classe avec ComVisible mis à true qui a un lookup propriété dessus :

[ComVisible(true)]
public class ScriptingContext
{
    public LookupService lookup { get; set; } //where LookupService is also ComVisible
}

Cependant, je veux faire preuve de flexibilité à l'égard des membres du ObjectForScripting que je transmets donc je ne peux pas préciser à l'avance ce que sera chaque propriété.

Idéalement, je voudrais simplement spécifier une paire nom-objet à transmettre, mais cela ne fonctionne pas.

Ce que j'ai essayé (et échoué) jusqu'à présent :

  • utilisant un Dictionary<string,object> comme mon contexte
  • en utilisant une extension de Dictionary<string,object> qui est marqué comme ComVisible
  • en utilisant un ExpandoObject
  • utilisant un List<KeyValuePair<string,object>>
  • en utilisant une extension de List<KeyValuePair<string,object>> qui est marqué comme ComVisible

Existe-t-il un moyen de transmettre un message personnalisable ObjectForScripting dans le WPF WebBrowser que je manque ?

Était-ce utile?

La solution

Je ne suis pas sûr de ce que vous entendez par personnalisable, mais il existe de nombreuses façons d'accomplir ce que vous recherchez, comme créer un wrapper pour votre dictionnaire et en faire votre ObjectForScripting :

[ComVisible(true)] 
public class ScriptingContext 
{
    private Dictionary<string, object> objectsForScripting;
    public object GetValue(string s) 
    {
        return objectsForScripting[s];
    }
}

Avec le javascript correspondant window.external.GetValue("lookup").getValue(someId).

Notez que vous pouvez également transmettre des objets ComVisible à javascript via la méthode InvokeScript et interagir avec eux de cette façon, en utilisant quelque chose comme webBrowser.InvokeScript("RegisterProperty", "lookup", lookupObject) et gérez les objets que vous exposez du côté javascript.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top