Pregunta

Estoy usando el control MSIE WebBrowser en una aplicación de escritorio C # y estoy buscando una manera de construir y mantener árboles de objetos HtmlElement fuera de este control. Estoy tratando de cambiar rápidamente entre varias páginas complejas sin incurrir en la sobrecarga de volver a analizar el HTML cada vez (y no quiero mantener múltiples controles que se muestran / ocultan según sea necesario). Descubrí que a) solo puedo crear objetos HtmlElement a través del control HtmlDocument yb) una vez que elimino un " trunk " de los objetos HtmlElement del HtmlDocument del control, se "apaga", " aunque sigo manteniendo una fuerte referencia al elemento raíz. ¿Cómo puedo hacer esto?

P.S. Estoy dispuesto a considerar controles de navegador alternativos (por ejemplo, Gecko) si me permiten lograr lo anterior.

¿Fue útil?

Solución

Esto lo hará

// 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);

Dudo que esto mejore el rendimiento ya que el procesador de texto es rápido, y la memoria consumida seguirá siendo la misma si tiene una página grande con div ocultos o tiene múltiples div en la memoria en otros objetos.

Otros consejos

Puede usar la biblioteca MSHTML (mshtml.dll) para lograr esto. Básicamente, usaría un solo acerca de: página en blanco y luego escribiría y eliminaría contenido de forma dinámica.

Vea esta publicación de blog sobre este tema

También puede escribir un contenedor de interfaz personalizado que exponga la funcionalidad que necesita de mshtml en lugar de hacer referencia a todo (casi 8 MB) y es realmente fácil hacerlo usando f12 en VS.

¿Realmente necesita eliminarlos de manera efectiva? ¿Qué tal si dejas tu " sucursal " en el DOM como hijo de un DIV cuyo estilo = " display: none " ;. De esa forma, son objetos DOM reales y vivos pero no visibles.

Creo que también podría usar el htmlagilitypack Le permite analizar una vez, consultar el árbol HTML usando XPath o mediante iteradores y volver a escribir el árbol con un método de guardar cuando haya terminado. Dependiendo de su estructura, puede crear un adaptador alrededor de las clases, porque solo funciona en un documento html completo y lo desea solo en elementos, pero esto no debería ser demasiado difícil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top