スタイルはCSSで制御できます。そしてそのCSSをWebBrowserのHtmlDocumentに適用する方法は、HTMLへ適用する方法と同様に次の3つがあります。
webBrowser.Navigate("about:blank");
としてドキュメントを作成した場合、既定では後方互換モードとなり適用できるスタイルが制約されます。この問題は、webBrowser.DocumentText = "<!DOCTYPE html>";
として作成することで解決できます。compatMode property (Internet Explorer) | MSDN
作成したlink要素をhead要素に追加することで、指定のスタイルシートを読み込ませられます。
HtmlDocument document = webBrowser.Document; HtmlElement link = document.CreateElement("link"); link.SetAttribute("rel", "stylesheet"); link.SetAttribute("type", "text/css"); link.SetAttribute("href", "sample.css"); HtmlElementCollection heads = document.GetElementsByTagName("head"); heads[0].AppendChild(link);
DomDocumentからIHTMLDocument2を取得し、それのcreateStyleSheet()からでも読み込めます。
mshtml.IHTMLDocument2 htmlDocument2 = (mshtml.IHTMLDocument2)webBrowser.Document.DomDocument; htmlDocument2.createStyleSheet("sample.css");
スタイルシートを相対パスで指定した場合には、これらのいずれも読み込まれているWebページのパス (webBrowser.Url) が基準となります。これをアプリケーションの作業ディレクトリを基準とするには、ファイルから文字列として読み込み、それをstyle要素に設定します。
mshtml.IHTMLDocument2 htmlDocument2 = (mshtml.IHTMLDocument2)webBrowser.Document.DomDocument; mshtml.IHTMLStyleSheet htmlStyleSheet = htmlDocument2.createStyleSheet(); using (StreamReader streamReader = new StreamReader("sample.css")) { htmlStyleSheet.cssText = streamReader.ReadToEnd(); }
mshtml名前空間のクラスを利用するには、Microsoft.mshtmlを参照に追加します。
style要素にはテキストで設定できないため、次のようには記述できません。
HtmlDocument document = webBrowser.Document;
HtmlElement head = document.GetElementsByTagName("head")[0];
HtmlElement element = document.CreateElement("style");
element.InnerText = "p{color:blue}"; // 例外発生
head.AppendChild(element);
このようにInnerTextで設定しようとするとCOMException「HRESULT からの例外:0x800A0258」が発生し、続けてNotSupportedException例外「プロパティは、この型の HtmlElement 上でサポートされていません。」も発生します。よって次のように、IHTMLStyleSheetを介してスタイルを設定します。
HtmlDocument.DomDocumentプロパティからアンマネージド インターフェイスのポインタを取得し、IHTMLDocument2へキャストします。そしてそれのcreateStyleSheet()メソッドでStyleSheetオブジェクトを作成し、そこで個々でスタイルを定義します。c# - How to inject CSS in WebBrowser control? - Stack Overflow
mshtml.IHTMLDocument2 htmlDocument2 = (mshtml.IHTMLDocument2)webBrowser.Document.DomDocument; mshtml.IHTMLStyleSheet htmlStyleSheet = htmlDocument2.createStyleSheet(); htmlStyleSheet.addRule("body", "background-color: red;"); htmlStyleSheet.addRule("p", "color: blue;");
IHTMLStyleSheet** createStyleSheet( [in, optional] String sURL, // ドキュメントに追加するスタイルシートのURL [in, optional] Integer iIndex // styleSheetsコレクションに追加する位置を表すインデックス );IHTMLDocument2::createStyleSheet method (Internet Explorer) | MSDN
sURLがファイル名ならばlinkオブジェクトとして、URLならばstyleオブジェクトとして追加されます。iIndexを省略した場合はコレクションの末尾に追加され、sURLを省略した場合には新規に作成されます。
Integer* addRule( [in] String sSelector, // 新しいルールのセレクタ [in] String sStyle, // このスタイル ルールの割り当て [in, optional] Integer iIndex = -1 // rulesコレクションに追加する位置を表すインデックス );IHTMLStyleSheet::addRule method (Internet Explorer) | MSDN
スタイルをテキストで設定、または取得できます。cssText property (Internet Explorer) | MSDN
htmlStyleSheet.cssText = "P{COLOR: blue}";C# WebBrowser control not applying css - Stack Overflow
要素のstyle属性へは、HtmlElementのStyleプロパティから文字列としてアクセスできます。HtmlElement.Style プロパティ (System.Windows.Forms) | MSDN
HtmlDocument document = webBrowser.Document; HtmlElement element = document.CreateElement("p"); element.Style = "color:red; font-weight:bold";
なお、これをSetAttribute()で指定しても適用されません。
element.SetAttribute("style", "color:red");
Styleに無効な値を指定した場合、このプロパティはnullになります。
element.Style = "color: rgb(255, 0, 0)"; Console.Write(element.Style); // "COLOR: rgb(255,0,0)" element.Style = "color: hsl(0, 100%, 50%)"; Console.Write(element.Style); // null