Show / Hide Table of Contents

Практическое руководство. Изменение стилей элемента в управляемой объектной модели 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

  1. Создайте проект Windows Forms.

  2. Создайте новый файл класса с расширением соответствующие для используемого языка программирования.

  3. Копировать StyleGenerator код в разделе "Пример" в этом разделе класса в файл класса и сохраните код.

  4. Сохраните следующий код HTML в файл с именем отнести.

    <HTML>
        <BODY>
    
            <DIV style="font-face:arial;font-weight:bold;">
                Hello, world!
            </DIV><P>
    
            <DIV>
                Hello again, world!
            </DIV><P>
    
        </BODY>
    </HTML>
    
  5. Добавить WebBrowser управления с именем webBrowser1 в главную форму проекта.

  6. Добавьте следующий код в файл кода проекта.

    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();
        }
    }
    
  7. Запустите проект. Наведите курсор на первый 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();
        }
    }
}

См. также

  • HtmlElement
Back to top Неофициальная документация по .NET на русском языке. Лицензия: CC-BY 4.0. Основано на документации по .NET с Microsoft Docs
Generated by DocFX