Pergunta

Eu estou usando o controle WebBrowser MSIE em uma aplicação desktop C # e estou procurando uma maneira de construir e manter árvores de HtmlElement objetos fora desse controle. Eu estou tentando alternar rapidamente entre várias páginas complexas sem incorrer na sobrecarga do HTML analisar re-a cada vez (e eu não quero manter vários controles que são mostrados / escondidos conforme necessário). Eu descobri que a) eu só pode criar objetos HtmlElement via HtmlDocument do controle e b) uma vez que eu remover um "tronco" de HtmlElement objetos de HtmlDocument do controle, ele "morre", apesar de eu continuar mantendo uma forte referência à raiz elemento. Como posso fazer isso?

P.S. Estou disposto a considerar controles do navegador alternativo (por exemplo Gecko) se me permita realizar a acima.

Foi útil?

Solução

Isso vai fazê-lo

// On screen webbrowser control
webBrowserControl.Navigate("about:blank");
webBrowserControl.Document.Write("<div id=\"div1\">This will change</div>");
var elementToReplace = webBrowserControl.Document.GetElementById("div1");
var nodeToReplace = elementToReplace.DomElement as mshtml.IHTMLDOMNode;

// In memory webbrowser control to load fragement into
// It needs this base object as it is a COM control
var webBrowserFragement = new WebBrowser();
webBrowserFragement.Navigate("about:blank");
webBrowserFragement.Document.Write("<div id=\"div1\">Hello World!</div>");
var elementReplacement = webBrowserFragement.Document.GetElementById("div1");
var nodeReplacement = elementReplacement.DomElement as mshtml.IHTMLDOMNode;

// The magic happens here!
nodeToReplace.replaceNode(nodeReplacement);

Eu duvido que isso vai melhorar performce como o processador de texto é rápido, e a memória consumida ainda será o mesmo se você tiver um grande página com div escondida do ou ter múltiplos div de memória em outros objetos?

Outras dicas

Você pode usar a biblioteca MSHTML (mshtml.dll) para alcançar este objectivo. Basicamente, você usaria uma única sobre:. Página em branco e, em seguida, dinamicamente escrever e conteúdo remover a partir dele

Veja este href="http://ryanfarley.com/blog/archive/2004/12/23/1330.aspx" rel="nofollow noreferrer"> blog

Você também pode escrever um wrapper interface personalizada que expõe a funcionalidade que você precisa de mshtml em vez de fazer referência a coisa toda (Quase 8MB) e é realmente fácil de fazer usando f12 em VS.

Você realmente precisa para removê-los enturely? Que tal deixar o seu "ramo" no DOM como o filho de um DIV cujo style = "display: none". Dessa forma, eles são objetos reais, DOM ao vivo, mas não visível.

Eu acho que você também pode usar o HtmlAgilityPack Ele permite que você para analisar uma vez, consultando a árvore HTML utilizando XPath ou via iterators e re-escrever a árvore com um método Save quando tiver terminado. Dependendo de sua estrutura, você pode simplesmente criar um adaptador em torno das aulas, porque ele só funciona em todo um documento HTML e deseja-lo em apenas elementos, mas isso não deve ser muito difícil.

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