Dizionario Passando per oggettiForscripting con WPF WebBrowser
-
11-12-2019 - |
Domanda
Sto usando un componente WebBrowser
in WPF per ospitare alcuni JavaScript + HTML e voglio essere in grado di passare un oggetto personalizzabile in quanto proprietà ObjectForScripting
. Il mio obiettivo finale è che il JavaScript in esecuzione nel WebBrowser
può chiamare qualcosa come:
window.external['lookup'].getValue(someId);
.
Posso ottenere qualcosa vicino a questo implementando una classe con ComVisible
impostato su true
che ha una proprietà lookup
su di esso:
[ComVisible(true)]
public class ScriptingContext
{
public LookupService lookup { get; set; } //where LookupService is also ComVisible
}
.
Tuttavia, voglio essere flessibile sui membri sul ObjectForScripting
che sto passando in modo da non poter specificare ciò che ogni proprietà sarà in anticipo.
Idealmente vorrei specificare solo una coppia di oggetto-oggetto da passare, ma afeict questo non funziona.
Quello che ho provato (e fallito con) finora:
- .
- Utilizzo di un
Dictionary<string,object>
come il mio contesto - Utilizzo di un'estensione del
Dictionary<string,object>
contrassegnato comeComVisible
- Utilizzo di un
ExpandoObject
- Utilizzo di un
List<KeyValuePair<string,object>>
- Utilizzo di un'estensione del
List<KeyValuePair<string,object>>
contrassegnato comeComVisible
C'è un modo per superare un
ObjectForScripting
personalizzabile nel WPFWebBrowser
che mi manca?
Soluzione
Non sono sicuro di cosa intendi con personalizzabile, ma ci sono molti modi per realizzare ciò che stai andando, come costruire un wrapper per il tuo dizionario e avere essere il tuo oggettoForscription:
[ComVisible(true)]
public class ScriptingContext
{
private Dictionary<string, object> objectsForScripting;
public object GetValue(string s)
{
return objectsForScripting[s];
}
}
.
con il corrispondente window.external.GetValue("lookup").getValue(someId)
JavaScript.
Nota che è inoltre possibile passare gli oggetti con laboratoria a JavaScript attraverso il metodo invocsiascript e interagire con loro in questo modo, usando qualcosa come webBrowser.InvokeScript("RegisterProperty", "lookup", lookupObject)
e gestire gli oggetti che stai espandendo sul lato JavaScript.