Übergeben von Dictionary an ObjectForScripting mit WPF WebBrowser
-
11-12-2019 - |
Frage
Ich verwende ein WebBrowser
Komponente in WPF zum Hosten von JavaScript + HTML und ich möchte in der Lage sein, ein anpassbares Objekt als zu übergeben ObjectForScripting
Eigentum.Mein Endziel ist, dass das Javascript im läuft WebBrowser
kann so etwas nennen wie:
window.external['lookup'].getValue(someId);
Ich kann etwas Ähnliches erreichen, indem ich eine Klasse mit implementieren ComVisible
einstellen true
das hat ein lookup
Eigentum darauf:
[ComVisible(true)]
public class ScriptingContext
{
public LookupService lookup { get; set; } //where LookupService is also ComVisible
}
Allerdings möchte ich hinsichtlich der Mitgliederzahl flexibel sein ObjectForScripting
die ich übergebe, sodass ich nicht im Voraus angeben kann, wie die einzelnen Objekte aussehen werden.
Idealerweise würde ich gerne nur ein Name-Objekt-Paar angeben, das übergeben werden soll, aber das funktioniert nicht.
Was ich bisher versucht habe (und damit gescheitert bin):
- Verwendung einer
Dictionary<string,object>
als mein Kontext - mit einer Erweiterung von
Dictionary<string,object>
das ist markiert alsComVisible
- mit einem
ExpandoObject
- Verwendung einer
List<KeyValuePair<string,object>>
- mit einer Erweiterung von
List<KeyValuePair<string,object>>
das ist markiert alsComVisible
Gibt es eine Möglichkeit, eine anpassbare Version zu übergeben? ObjectForScripting
in die WPF WebBrowser
dass ich vermisse?
Lösung
Ich bin mir nicht sicher, was Sie unter „anpassbar“ verstehen, aber es gibt viele Möglichkeiten, das zu erreichen, was Sie wollen, wie zum Beispiel die Erstellung eines Wrappers für Ihr Wörterbuch und die Verwendung dieses Wrappers als ObjectForScripting:
[ComVisible(true)]
public class ScriptingContext
{
private Dictionary<string, object> objectsForScripting;
public object GetValue(string s)
{
return objectsForScripting[s];
}
}
Mit dem entsprechenden Javascript window.external.GetValue("lookup").getValue(someId)
.
Beachten Sie, dass Sie ComVisible-Objekte auch über die InvokeScript-Methode an Javascript übergeben und auf diese Weise mit ihnen interagieren können, indem Sie beispielsweise Folgendes verwenden: webBrowser.InvokeScript("RegisterProperty", "lookup", lookupObject)
und verwalten Sie die Objekte, die Sie auf der Javascript-Seite verfügbar machen.