Вопрос

Я использую MSIE WebBrowser управления в настольном приложении C # и я ищу способ создавать и поддерживать деревья HtmlElement объекты вне этого элемента управления.Я пытаюсь быстро переключаться между несколькими сложными страницами без дополнительных затрат на повторный анализ HTML каждый раз (и я не хочу поддерживать несколько элементов управления, которые отображаются / скрыты по мере необходимости).Я обнаружил, что а) я могу только создавать HtmlElement объекты с помощью элемента управления HtmlDocument и б) как только я удалю "ствол" из HtmlElement объекты из элементов управления HtmlDocument, он "отмирает", даже несмотря на то, что я продолжаю поддерживать сильную ссылку на корневой элемент.Как я могу это сделать?

P.S.Я готов рассмотреть альтернативные элементы управления браузером (напримерГеккон), если они позволят мне выполнить вышеизложенное.

Это было полезно?

Решение

Это сделает это

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

Я сомневаюсь, что это улучшит производительность, поскольку средство визуализации текста работает быстро, а потребляемая память останется прежней, если у вас есть одна большая страница со скрытыми разделениями или несколько разделений в памяти в других объектах?

Другие советы

Вы можете использовать библиотеку MSHTML (mshtml.dll) для достижения этой цели.По сути, вы бы использовали единственную страницу about: blank, а затем динамически записывали и удаляли с нее содержимое.

Видишь это запись в блоге на эту тему

Вы также можете написать пользовательскую оболочку интерфейса, которая предоставляет необходимую вам функциональность из mshtml, а не ссылается на все это целиком (почти 8 МБ), и это действительно легко сделать, используя f12 в VS.

Вам действительно нужно удалить их полностью?Как насчет того, чтобы оставить свою "ветку" в DOM как дочернюю для DIV, стиль которого ="display:none".Таким образом, они являются реальными, живыми объектами DOM, но не видимыми.

Я думаю, вы могли бы также использовать htmlagilitypack htmlagilitypack Это позволяет вам выполнить синтаксический анализ один раз, запросив HTML-дерево с помощью XPath или с помощью итераторов и переписав дерево с помощью метода сохранения по завершении.В зависимости от вашей структуры вы можете просто создать адаптер вокруг классов, потому что он работает только со всем html-документом, а вы хотите использовать его только для элементов, но это не должно быть слишком сложно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top