Nasıl yapılır: Yönetilen HTML Belgesi Nesne Modelinde Bir Öğedeki Stilleri Değiştirme
Bir belgenin ve öğelerinin görünümünü denetlemek için HTML'deki stilleri kullanabilirsiniz. HtmlDocument ve HtmlElement aşağıdaki biçimde stil dizeleri alan destek Style özellikleri:
name1:value1;...;nameN:valueN;
DIV
Yazı tipini Arial ve tüm metinleri kalın olarak ayarlayan stil dizesi içeren bir aşağıdadır:
<DIV style="font-face:arial;font-weight:bold;">
Hello, world!
</DIV>
özelliğini kullanarak Style stilleri düzenlemeyle ilgili sorun, dizeye tek tek stil ayarları eklemenin ve dizeden kaldırmanın zahmetli olmasıdır. Örneğin, kullanıcı imleci üzerinde konumlandırdığında önceki metni italik olarak işlemeniz ve imleç DIV
'den ayrıldığında DIV
italik değerleri çıkarmanız karmaşık bir yordam haline gelir. Çok sayıda stili bu şekilde değiştirmeniz gerekiyorsa zaman sorun haline gelebilir.
Aşağıdaki yordam, HTML belgeleri ve öğelerindeki stilleri kolayca işlemek için kullanabileceğiniz kodu içerir. Yordam, Windows Forms'da yeni proje oluşturma ve forma denetim ekleme gibi temel görevlerin nasıl gerçekleştirildiğini öğrenmenizi gerektirir.
Windows Forms uygulamasında stil değişikliklerini işlemek için
Yeni bir Windows Forms projesi oluşturun.
Programlama dilinize uygun uzantıyla biten yeni bir sınıf dosyası oluşturun.
StyleGenerator
Bu konunun Örnek bölümündeki sınıf kodunu sınıf dosyasına kopyalayın ve kodu kaydedin.Aşağıdaki HTML'yi Test.htm adlı bir dosyaya kaydedin.
<HTML> <BODY> <DIV style="font-face:arial;font-weight:bold;"> Hello, world! </DIV><P> <DIV> Hello again, world! </DIV><P> </BODY> </HTML>
Projenizin ana formuna adlı
webBrowser1
bir WebBrowser denetim ekleyin.Projenizin kod dosyasına aşağıdaki kodu ekleyin.
Önemli
Olay işleyicisinin
webBrowser1_DocumentCompleted
olay için dinleyici olarak yapılandırıldığından DocumentCompleted emin olun. Visual Studio'da denetime WebBrowser çift tıklayın; metin düzenleyicisinde dinleyiciyi program aracılığıyla yapılandırın.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
Projeyi çalıştırma. kodun etkilerini gözlemlemek için imlecinizi ilkinin
DIV
üzerinde çalıştırın.
Örnek
Aşağıdaki kod örneği, mevcut bir stil değerini ayrıştıran, stilleri eklemeyi, değiştirmeyi ve kaldırmayı destekleyen ve istenen değişikliklerle yeni bir stil değeri döndüren sınıfın tam kodunu StyleGenerator
gösterir.
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
Ayrıca bkz.
.NET Desktop feedback