Практическое руководство. Изменение стилей элемента в управляемой объектной модели HTML-документов
Стили в формате HTML можно использовать для управления внешним видом документа и его элементов. HtmlDocument и HtmlElement поддержки Style свойств, которые принимают строки в следующем формате:
name1:value1;...;nameN:valueN;
Вот DIV
с стиля строка, задающая шрифт Arial и весь текст, будут выводиться полужирным шрифтом:
<DIV style="font-face:arial;font-weight:bold;">
Hello, world!
</DIV>
Проблема при управлении стилей с помощью Style свойство является то, что он может оказаться нелегкой задачей Добавление и удаление отдельных параметров стилей из строки. Например, он стал бы сложная процедура для отображение текста курсивом, при наведении курсора на DIV
и отключение курсивного начертания, когда курсор покидает DIV
. Время может стать проблемой, если необходимо управлять большим числом стили таким образом.
Следующая процедура содержит код, который можно использовать, чтобы упростить управление стилями в HTML-документы и элементы. Процедура требует, что вы знаете, как для выполнения основных задач в Windows Forms, таких как создание нового проекта и добавление элемента управления в форму.
Для обработки изменений стилей в приложении Windows Forms
Создайте проект Windows Forms.
Создайте новый файл класса с расширением соответствующие для используемого языка программирования.
Копировать
StyleGenerator
код в разделе "Пример" в этом разделе класса в файл класса и сохраните код.Сохраните следующий код HTML в файл с именем отнести.
<HTML> <BODY> <DIV style="font-face:arial;font-weight:bold;"> Hello, world! </DIV><P> <DIV> Hello again, world! </DIV><P> </BODY> </HTML>
Добавить WebBrowser управления с именем
webBrowser1
в главную форму проекта.Добавьте следующий код в файл кода проекта.
Important
Убедитесь, что
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(); } }
Запустите проект. Наведите курсор на первый
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();
}
}
}