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 come ComVisible
  • Utilizzo di un ExpandoObject
  • Utilizzo di un List<KeyValuePair<string,object>>
  • Utilizzo di un'estensione del List<KeyValuePair<string,object>> contrassegnato come ComVisible

    C'è un modo per superare un ObjectForScripting personalizzabile nel WPF WebBrowser che mi manca?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top