Pergunta

Eu estou usando um WebBrowser componente no WPF para hospedar um pouco de JavaScript + HTML e eu quero ser capaz de passar um personalizável objeto como o ObjectForScripting propriedade.Meu objetivo final é que o javascript em execução no WebBrowser pode chamar algo como:

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

Que eu possa alcançar algo próximo a isso implementando uma classe com ComVisible conjunto para true que tem um lookup propriedade:

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

No entanto, eu quero ser flexível sobre os membros do ObjectForScripting que estou passando, então eu não posso especificar o que cada propriedade será de antemão.

Idealmente, eu gostaria apenas de especificar um nome de objeto de par para passar, mas afaict isto não funciona.

O que eu tentei (e não com) até agora:

  • usando um Dictionary<string,object> como meu contexto
  • usando uma extensão de Dictionary<string,object> que é marcada como ComVisible
  • usando um ExpandoObject
  • usando um List<KeyValuePair<string,object>>
  • usando uma extensão de List<KeyValuePair<string,object>> que é marcada como ComVisible

Existe alguma maneira de passar um personalizável ObjectForScripting no WPF WebBrowser que eu estou ausente?

Foi útil?

Solução

Eu não tenho certeza do que você quer dizer com personalizável, mas há muitas maneiras de realizar o que você está indo para, tais como a construção de um wrapper para o dicionário e ter que ser o seu ObjectForScripting:

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

Com o javascript correspondente window.external.GetValue("lookup").getValue(someId).

Observe que você também pode passar ComVisible objetos javascript através do InvokeScript método e interagir com eles de que maneira, usando algo como webBrowser.InvokeScript("RegisterProperty", "lookup", lookupObject) e gerenciar os objetos que você está expondo no javascript do lado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top