Comment : modifier des styles d'un élément dans le modèle objet de document HTML managé
Vous pouvez utiliser des styles dans du HTML pour contrôler l'apparence d'un document et de ses éléments. HtmlDocument et HtmlElement prennent en charge des propriétés Style qui prennent des chaînes de style au format suivant :
name1:value1;...;nameN:valueN;
Voici DIV avec une chaîne de style qui spécifie l'utilisation de la police Arial et l'affichage de la totalité du texte en gras :
<DIV style="font-face:arial;font-weight:bold;">
Hello, world!
</DIV>
La difficulté que présente la manipulation de styles à l'aide de la propriété Style réside dans le fait que l'ajout et la suppression de paramètres de style individuels peuvent s'avérer fastidieux. Par exemple, la procédure deviendrait complexe s'il fallait restituer le texte précédent en italique chaque fois que l'utilisateur place le curseur sur DIV et supprimer les caractères en italique lorsque le curseur sort de DIV. La manipulation d'un grand nombre de styles de cette façon prendrait trop de temps.
La procédure suivante contient un code que vous pouvez utiliser pour manipuler facilement des styles dans des documents HTML et dans des éléments. Pour exécuter cette procédure, vous devez maîtriser certaines tâches de base dans les Windows Forms, telles que la création d'un nouveau projet et l'ajout d'un contrôle à un formulaire.
Pour traiter des modifications de style dans une application Windows Forms
Créez un projet Windows Forms.
Créez un fichier de classe avec l'extension appropriée pour votre langage de programmation.
Copiez le code de classe StyleGenerator contenu dans la section Exemple de cette rubrique dans le fichier de classe, puis enregistrez ce code.
Enregistrez le code HTML suivant dans un fichier nommé Test.htm.
<HTML> <BODY> <DIV style="font-face:arial;font-weight:bold;"> Hello, world! </DIV><P> <DIV> Hello again, world! </DIV><P> </BODY> </HTML>
Ajoutez un contrôle WebBrowser nommé webBrowser1 au formulaire principal de votre projet.
Ajoutez le code suivant au fichier de code de votre projet.
Important
Vérifiez que le gestionnaire d'événements webBrowser1_DocumentCompleted est configuré comme écouteur pour l'événement DocumentCompleted. Dans Visual Studio, double-cliquez sur le contrôle WebBrowser ; dans un éditeur de texte, configurez l'écouteur par programme.
<System.Security.Permissions.PermissionSet(Security.Permissions.SecurityAction.Demand, Name:="FullTrust")> _ 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
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(); } }
Exécutez le projet. Placez votre curseur sur le premier DIV afin d'observer les effets du code.
Exemple
L'exemple de code suivant affiche le code complet pour la classe StyleGenerator, qui analyse une valeur de style existante, prend en charge l'ajout, la modification et la suppression de styles, et retourne une nouvelle valeur de style contenant les modifications demandées.
Imports System
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
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();
}
}
}