Passer le dictionnaire à ObjectForScripting avec WPF WebBrowser
-
11-12-2019 - |
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é commeComVisible
- en utilisant un
ExpandoObject
- utilisant un
List<KeyValuePair<string,object>>
- en utilisant une extension de
List<KeyValuePair<string,object>>
qui est marqué commeComVisible
Existe-t-il un moyen de transmettre un message personnalisable ObjectForScripting
dans le WPF WebBrowser
que je manque ?
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.