문제

MSIE를 사용하고 있습니다 WebBrowser C# 데스크탑 애플리케이션을 제어하고 나무를 건축하고 유지하는 방법을 찾고 있습니다. HtmlElement 이 컨트롤 외부의 개체. 매번 HTML을 다시 준비하는 오버 헤드를 발생시키지 않고 여러 개의 복잡한 페이지를 빠르게 전환하려고합니다 (필요에 따라 표시/숨겨진 여러 컨트롤을 유지하고 싶지 않습니다). 나는 a) 만 만들 수 있음을 발견했다 HtmlElement 컨트롤을 통한 개체 HtmlDocument 그리고 b) 일단 "트렁크"를 제거하면 HtmlElement 컨트롤의 개체 HtmlDocument, 루트 요소에 대한 강력한 참조를 계속 유지하고 있지만 "사망"합니다. 어떻게 할 수 있습니까?

추신 : 나는 위의 것을 달성 할 수 있다면 대체 브라우저 컨트롤 (예 : Gecko)을 기꺼이 고려할 것입니다.

도움이 되었습니까?

해결책

이것은 할 것입니다

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

텍스트 렌더러가 빠르기 때문에 이것이 성능이 향상 될 것이라고 의심하고, 다른 개체에 숨겨진 div가 있거나 여러 개의 div가 메모리에있는 큰 페이지가 있으면 소비 된 메모리가 여전히 동일 할 것입니다.

다른 팁

MSHTML 라이브러리 (mshtml.dll)를 사용하여이를 달성 할 수 있습니다. 기본적으로 공백 페이지를 사용한 다음 컨텐츠를 동적으로 쓰고 제거합니다.

이것 좀 봐 이 주제에 대한 블로그 게시물

또한 모든 것을 참조하지 않고 MSHTML에서 필요한 기능을 노출시키는 사용자 정의 인터페이스 래퍼를 작성할 수 있으며 VS에서 F12를 사용하는 것은 정말 쉽습니다.

당신은 정말로 그것들을 완전히 제거해야합니까? 스타일 = "display : none"의 DIV의 자녀로서 DOM에 "Branch"를 남겨 두는 것은 어떻습니까? 그렇게하면 실제, 살아있는 DOM 객체이지만 보이지 않습니다.

나는 당신이 또한 사용할 수 있다고 생각합니다 htmlagilitypackXPath를 통해 또는 반복자를 통해 HTML 트리를 쿼리하고 완료시 저장 방법으로 트리를 다시 작성하여 한 번 구문 분석 할 수 있습니다. 구조에 따라 전체 HTML 문서에서만 작동하고 요소에서만 원하기 때문에 클래스 주변의 어댑터 만 만들 수 있지만 너무 어렵지 않아야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top