方法: マネージド HTML DOM (Document Object Model) の要素のスタイルを変更する
HTML のスタイルを使用して、ドキュメントとその要素の外観を制御できます。 HtmlDocument と HtmlElement では、次の形式のスタイル文字列を受け取る Style のプロパティをサポートしています。
name1:value1;...;nameN:valueN;
フォントを Arial に設定し、すべてのテキストを太字に設定するスタイル文字列が含まれる DIV
をこちらに示します。
<DIV style="font-face:arial;font-weight:bold;">
Hello, world!
</DIV>
Style プロパティを使用してスタイルを操作することの問題点は、文字列から個々のスタイル設定を追加したり削除したりすることが煩雑になる可能性があることです。 たとえば、ユーザーが DIV
の上にカーソルを置いたときにその前のテキストを斜体で表示し、カーソルを DIV
から離すと斜体を解除するのは、複雑な手順になります。 多数のスタイルをこの方法で操作する必要がある場合は、時間が問題になります。
次の手順には、HTML のドキュメントと要素のスタイルを簡単に操作するために使用できるコードが含まれています。 この手順では、新しいプロジェクトの作成やフォームへのコントロールの追加など、Windows フォームで基本的なタスクを実行する方法を理解している必要があります。
Windows フォーム アプリケーションでスタイルの変更を処理するには
新しい Windows フォーム プロジェクトを作成します。
お使いのプログラミング言語に適した拡張子で終了する新しいクラス ファイルを作成します。
このトピックの「例」セクションの
StyleGenerator
クラス コードをクラス ファイルにコピーし、コードを保存します。次の HTML を Test.htm という名前のファイルに保存します。
<HTML> <BODY> <DIV style="font-face:arial;font-weight:bold;"> Hello, world! </DIV><P> <DIV> Hello again, world! </DIV><P> </BODY> </HTML>
webBrowser1
という名前の WebBrowser コントロールをプロジェクトのメイン フォームに追加します。次のコードをプロジェクトのコード ファイルに追加します。
重要
webBrowser1_DocumentCompleted
イベント ハンドラーが DocumentCompleted イベントのリスナーとして構成されていることを確認します。 Visual Studio で、WebBrowser コントロールをダブルクリックします。テキスト エディターで、プログラムを使用してリスナーを構成します。StyleGenerator sg = null; HtmlElement elem = null; private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { sg = new StyleGenerator(); webBrowser1.Document.MouseOver += new HtmlElementEventHandler(Document_MouseOver); webBrowser1.Document.MouseLeave += new HtmlElementEventHandler(Document_MouseLeave); } void Document_MouseOver(object sender, HtmlElementEventArgs e) { elem = webBrowser1.Document.GetElementFromPoint(e.MousePosition); if (elem.TagName.Equals("DIV")) { sg.ParseStyleString(elem.Style); sg.SetStyle("font-style", "italic"); elem.Style = sg.GetStyleString(); } } void Document_MouseLeave(object sender, HtmlElementEventArgs e) { if (elem != null) { sg.RemoveStyle("font-style"); elem.Style = sg.GetStyleString(); // Reset, since we may mouse over a new DIV element next time. sg.Clear(); } }
Public Class Form1 Dim SG As StyleGenerator = Nothing Dim Elem As HtmlElement = Nothing Dim WithEvents DocumentEvents As HtmlDocument Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted SG = New StyleGenerator() DocumentEvents = WebBrowser1.Document End Sub Private Sub Document_MouseOver(ByVal sender As Object, ByVal e As HtmlElementEventArgs) Handles DocumentEvents.MouseOver Elem = WebBrowser1.Document.GetElementFromPoint(e.MousePosition) If Elem.TagName.Equals("DIV") Then SG.ParseStyleString(Elem.Style) SG.SetStyle("font-style", "italic") Elem.Style = SG.GetStyleString() End If End Sub Private Sub Document_MouseLeave(ByVal sender As Object, ByVal e As HtmlElementEventArgs) Handles DocumentEvents.MouseLeave If (Elem IsNot Nothing) Then SG.RemoveStyle("font-style") Elem.Style = SG.GetStyleString() ' Reset, since we may mouse over a new DIV element next time. SG.Clear() End If End Sub End Class
プロジェクトを実行します。 最初の
DIV
の上にカーソルを移動し、コードの効果を観察します。
例
次のコード例は、既存のスタイル値を解析し、スタイルの追加、変更、および削除をサポートして、要求された変更が加えられた新しいスタイル値を返す、StyleGenerator
クラスの完全なコードを示しています。
using System;
using System.Collections.Generic;
using System.Text;
namespace ManagedDOMStyles
{
public class StyleGenerator
{
private Dictionary<string, string> styleDB;
public StyleGenerator()
{
styleDB = new Dictionary<string, string>();
}
public bool ContainsStyle(string name)
{
return(styleDB.ContainsKey(name));
}
public string SetStyle(string name, string value)
{
string oldValue = "";
if (!(name.Length > 0))
{
throw (new ArgumentException("Parameter name cannot be zero-length."));
}
if (!(value.Length > 0))
{
throw (new ArgumentException("Parameter value cannot be zero-length."));
}
if (styleDB.ContainsKey(name))
{
oldValue = styleDB[name];
}
styleDB[name] = value;
return (oldValue);
}
public string GetStyle(string name)
{
if (!(name.Length > 0))
{
throw (new ArgumentException("Parameter name cannot be zero-length."));
}
if (styleDB.ContainsKey(name))
{
return (styleDB[name]);
}
else
{
return ("");
}
}
public void RemoveStyle(string name)
{
if (styleDB.ContainsKey(name))
{
styleDB.Remove(name);
}
}
public string GetStyleString()
{
if (styleDB.Count > 0)
{
StringBuilder styleString = new StringBuilder("");
foreach (string key in styleDB.Keys)
{
styleString.Append(String.Format("{0}:{1};", (object)key, (object)styleDB[key]));
}
return (styleString.ToString());
}
else
{
return ("");
}
}
public void ParseStyleString(string styles)
{
if (styles.Length > 0)
{
string[] stylePairs = styles.Split(new char[] { ';' });
foreach(string stylePair in stylePairs)
{
if (stylePairs.Length > 0)
{
string[] styleNameValue = stylePair.Split(new char[] { ':' });
if (styleNameValue.Length == 2)
{
styleDB[styleNameValue[0]] = styleNameValue[1];
}
}
}
}
}
public void Clear()
{
styleDB.Clear();
}
}
}
Imports System.Collections.Generic
Imports System.Text
Public Class StyleGenerator
Dim styleDB As Dictionary(Of String, String)
Public Sub New()
styleDB = New Dictionary(Of String, String)()
End Sub
Public Function ContainsStyle(ByVal name As String) As Boolean
Return styleDB.ContainsKey(name)
End Function
Public Function SetStyle(ByVal name As String, ByVal value As String) As String
Dim oldValue As String = ""
If (Not name.Length > 0) Then
Throw New ArgumentException("Parameter name cannot be zero-length.")
End If
If (Not value.Length > 0) Then
Throw New ArgumentException("Parameter value cannot be zero-length.")
End If
If (styleDB.ContainsKey(name)) Then
oldValue = styleDB(name)
End If
styleDB(name) = value
Return oldValue
End Function
Public Function GetStyle(ByVal name As String) As String
If (Not name.Length > 0) Then
Throw New ArgumentException("Parameter name cannot be zero-length.")
End If
If (styleDB.ContainsKey(name)) Then
Return styleDB(name)
Else
Return ""
End If
End Function
Public Sub RemoveStyle(ByVal name As String)
If (styleDB.ContainsKey(name)) Then
styleDB.Remove(name)
End If
End Sub
Public Function GetStyleString() As String
If (styleDB.Count > 0) Then
Dim styleString As New StringBuilder("")
Dim key As String
For Each key In styleDB.Keys
styleString.Append(String.Format("{0}:{1};", CType(key, Object), CType(styleDB(key), Object)))
Next key
Return styleString.ToString()
Else
Return ""
End If
End Function
Public Sub ParseStyleString(ByVal styles As String)
If (styles.Length) > 0 Then
Dim stylePairs As String() = styles.Split(New Char() {";"c})
Dim stylePair As String
For Each stylePair In stylePairs
If (stylePairs.Length > 0) Then
Dim styleNameValue As String() = stylePair.Split(New Char() {":"c})
If (styleNameValue.Length = 2) Then
styleDB(styleNameValue(0)) = styleNameValue(1)
End If
End If
Next stylePair
End If
End Sub
Public Sub Clear()
styleDB.Clear()
End Sub
End Class