スタイルの制御

スタイルはCSSで制御できます。そしてそのCSSをWebBrowserのHtmlDocumentに適用する方法は、HTMLへ適用する方法と同様に次の3つがあります。

webBrowser.Navigate("about:blank");としてドキュメントを作成した場合、既定では後方互換モードとなり適用できるスタイルが制約されます。この問題は、webBrowser.DocumentText = "<!DOCTYPE html>";として作成することで解決できます。compatMode property (Internet Explorer) | MSDN

スタイルシート / 外部CSS (External CSS)

作成した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要素 / 内部CSS (Internal CSS)

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を介してスタイルを設定します。

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

createStyleSheet()

IHTMLStyleSheet** createStyleSheet(
  [in, optional] String sURL,   // ドキュメントに追加するスタイルシートのURL
  [in, optional] Integer iIndex // styleSheetsコレクションに追加する位置を表すインデックス
);
IHTMLDocument2::createStyleSheet method (Internet Explorer) | MSDN

sURLがファイル名ならばlinkオブジェクトとして、URLならばstyleオブジェクトとして追加されます。iIndexを省略した場合はコレクションの末尾に追加され、sURLを省略した場合には新規に作成されます。

addRule()

Integer* addRule(
  [in] String sSelector, // 新しいルールのセレクタ
  [in] String sStyle,    // このスタイル ルールの割り当て
  [in, optional] Integer iIndex = -1 // rulesコレクションに追加する位置を表すインデックス
);
IHTMLStyleSheet::addRule method (Internet Explorer) | MSDN

cssText

スタイルをテキストで設定、または取得できます。cssText property (Internet Explorer) | MSDN

htmlStyleSheet.cssText = "P{COLOR: blue}";
C# WebBrowser control not applying css - Stack Overflow

style属性 / インラインCSS (Inline CSS)

要素の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
Microsoft Learnから検索