Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Sie können Formatvorlagen in HTML verwenden, um die Darstellung eines Dokuments und seiner Elemente zu steuern. HtmlDocument und HtmlElement unterstützen Style Eigenschaften, welche Stil-Strings des folgenden Formats enthalten:
name1:value1;...;nameN:valueN;
Hier ist ein DIV
mit einer Formatvorlage, die die Schriftart auf Arial setzt und den gesamten Text fett macht:
<DIV style="font-face:arial;font-weight:bold;">
Hello, world!
</DIV>
Das Problem beim Bearbeiten von Formatvorlagen mithilfe der Style Eigenschaft besteht darin, dass es sich als umständlich erweisen kann, einzelne Formatvorlageneinstellungen aus der Zeichenfolge hinzuzufügen und daraus zu entfernen. Als Beispiel wäre es ein komplexes Verfahren, mit dem Sie den vorherigen Text kursiv anzeigen können, wenn der Benutzer den Cursor über DIV
positioniert und die Kursivschrift entfernt, sobald der Cursor DIV
verlässt. Die Zeit könnte zum Problem werden, wenn Sie eine große Anzahl von Stilen auf diese Weise bearbeiten müssen.
Das folgende Verfahren enthält Code, mit dem Sie Formatvorlagen für HTML-Dokumente und -Elemente problemlos bearbeiten können. Das Verfahren erfordert, dass Sie wissen, wie Sie grundlegende Aufgaben in Windows Forms ausführen, z. B. das Erstellen eines neuen Projekts und das Hinzufügen eines Steuerelements zu einem Formular.
So verarbeiten Sie Formatänderungen in einer Windows Forms-Anwendung
Erstellen Sie ein neues Windows Forms-Projekt.
Erstellen Sie eine neue Klassendatei, die auf der Erweiterung endet, die für Ihre Programmiersprache geeignet ist.
Kopieren Sie den
StyleGenerator
Klassencode im Abschnitt "Beispiel" dieses Themas in die Klassendatei, und speichern Sie den Code.Speichern Sie den folgenden HTML-Code in einer Datei mit dem Namen Test.htm.
<HTML> <BODY> <DIV style="font-face:arial;font-weight:bold;"> Hello, world! </DIV><P> <DIV> Hello again, world! </DIV><P> </BODY> </HTML>
Fügen Sie dem Hauptformular Ihres Projekts ein WebBrowser Steuerelement hinzu, das benannt ist
webBrowser1
.Fügen Sie den folgenden Code zur Codedatei Ihres Projekts hinzu.
Von Bedeutung
Stellen Sie sicher, dass der
webBrowser1_DocumentCompleted
Ereignishandler als Listener für das DocumentCompleted Ereignis konfiguriert ist. Doppelklicken Sie in Visual Studio auf das Steuerelement. Konfigurieren Sie den WebBrowser Listener in einem Text-Editor programmgesteuert.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
Führen Sie das Projekt aus. Führen Sie den Cursor über den ersten
DIV
aus, um die Auswirkungen des Codes zu beobachten.
Beispiel
Das folgende Codebeispiel zeigt den vollständigen Code für die StyleGenerator
Klasse, der einen vorhandenen Formatvorlagenwert analysiert, das Hinzufügen, Ändern und Entfernen von Formatvorlagen unterstützt und einen neuen Formatvorlagenwert mit den angeforderten Änderungen zurückgibt.
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
Siehe auch
.NET Desktop feedback