4

C# デスクトップ アプリケーションでMSIE コントロールを使用しており、このコントロールの外部でオブジェクトのWebBrowserツリーを構築および維持する方法を探しています。HtmlElement毎回 HTML を再解析するオーバーヘッドを発生させることなく、複数の複雑なページをすばやく切り替えようとしています (必要に応じて表示/非表示にする複数のコントロールを維持したくありません)。HtmlElementa)コントロールを介してのみオブジェクトを作成できること、およびb)コントロールのからオブジェクトHtmlDocumentの「トランク」を削除すると、ルート要素への強い参照を維持し続けていても、「消滅」することを発見しました。これどうやってするの?HtmlElementHtmlDocument

PS 上記を実現できるのであれば、代わりのブラウザ コントロール (Gecko など) を検討したいと思います。

4

4 に答える 4

4

これでできます

// 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 を含む 1 つの大きなページがある場合、または他のオブジェクトのメモリに複数の div がある場合、消費されるメモリは同じになりますか?

于 2009-03-13T00:32:53.690 に答える
2

これを実現するには、MSHTML ライブラリ (mshtml.dll) を使用できます。基本的に、単一の about:blank ページを使用し、そこから動的にコンテンツを書き込んだり削除したりします。

このテーマに関するこのブログ投稿を参照してください

また、すべてを参照するのではなく (約 8 MB)、mshtml から必要な機能を公開するカスタム インターフェイス ラッパーを作成することもできます。これは、VS で f12 を使用して行うのが非常に簡単です。

于 2009-03-12T23:19:10.153 に答える
1

あなたは本当にそれらを熱心に取り除く必要がありますか?style = "display:none"のDIVの子として、DOMの「ブランチ」を残してはどうでしょうか。そうすれば、それらは実際のライブDOMオブジェクトですが、表示されません。

于 2009-03-10T20:28:10.907 に答える
0

htmlagilitypackも使用できると思います。 一度解析すると、XPathまたはイテレーターを使用してHTMLツリーにクエリを実行し、完了したらsaveメソッドを使用してツリーを書き直すことができます。構造によっては、クラスの周りにアダプタを作成するだけでよい場合があります。これは、htmlドキュメント全体でのみ機能し、要素でのみ機能するためですが、これはそれほど難しいことではありません。

于 2009-03-19T05:16:30.280 に答える