У меня есть проект, что я продолжаю работать в VS2005. Я добавил управление WebBrowser. Я добавляю основную пустую страницу к управлению
private const string _basicHtmlForm = "<html> "
+ "<head> "
+ "<meta http-equiv='Content-Type' content='text/html; charset=utf-8'/> "
+ "<title>Test document</title> "
+ "<script type='text/javascript'> "
+ "function ShowAlert(message) { "
+ " alert(message); "
+ "} "
+ "</script> "
+ "</head> "
+ "<body><div id='mainDiv'> "
+ "</div></body> "
+ "</html> ";
private string _defaultFont = "font-family: Arial; font-size:10pt;";
private void LoadWebForm()
{
try
{
_webBrowser.DocumentText = _basicHtmlForm;
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
и затем добавьте различные элементы через dom (использующий _webBrowser. Документ. CreateElement). Я также загружаю файл CSS:
private void AddStyles()
{
try
{
mshtml.HTMLDocument currentDocument = (mshtml.HTMLDocument) _webBrowser.Document.DomDocument;
mshtml.IHTMLStyleSheet styleSheet = currentDocument.createStyleSheet("", 0);
TextReader reader = new StreamReader(Path.Combine(Path.GetDirectoryName(Application.ExecutablePath),"basic.css"));
string style = reader.ReadToEnd();
styleSheet.cssText = style;
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Вот содержание страницы CSS:
body {
background-color: #DDDDDD;
}
.categoryDiv {
background-color: #999999;
}
.categoryTable {
width:599px; background-color:#BBBBBB;
}
#mainDiv {
overflow:auto; width:600px;
}
Страница стиля загружается успешно, но единственные элементы на странице, которые затрагиваются, являются теми, которые находятся первоначально на странице (тело и mainDiv). Я также попробовал включая CSS в элементе в разделе заголовка, но это все еще только влияет на элементы, которые являются там, когда страница создается.
Таким образом, мой вопрос, у кого-либо есть какая-либо идея о том, почему CSS не применяется к элементам, которые создаются после того, как страница загружается? Я также не попробовал применения CSS, пока все мои элементы не добавляются, но результаты не изменяются.
Трудно сказать, если вы не отправите ссылку на это.
, но обычно лучший метод для работы со стилями - это то, что у вас уже есть CSS на странице, а в вашем коде C # вы добавляете только идентификаторы или классы к элементам, чтобы увидеть эффекты стилей.
Возможно, объекты на странице существуют на момент загрузки страницы, поэтому каждый стиль может быть применен. Если вы добавляете узел в дерево DOM, это не значит, что он может манипулировать всеми своими атрибутами и отображаться в браузере. Приведенные выше методы, похоже, используют подход, который перезагружает страницу (DOM), что позволяет предположить, что это может быть именно так. Короче говоря, обновите страницу после добавления элемента
Я обнаружил, что к сгенерированным тегам с атрибутом класса не применяются их стили.
Это мой обходной путь, который выполняется после создания документа:
public static class WebBrowserExtensions
{
public static void Redraw(this WebBrowser browser)
{
string temp = Path.GetTempFileName();
File.WriteAllText(temp, browser.Document.Body.Parent.OuterHtml,
Encoding.GetEncoding(browser.Document.Encoding));
browser.Url = new Uri(temp);
}
}
Я использую подобный контрол вместо WebBrowser, я загружаю HTML страницу с правилами стиля "по умолчанию" и меняю правила в программе.
(DrawBack - сопровождение, когда мне нужно добавить правило, мне также нужно изменить его в коде)
' ----------------------------------------------------------------------
Public Sub mcFontOrColorsChanged(ByVal isRefresh As Boolean)
' ----------------------------------------------------------------------
' Notify whichever is concerned:
Dim doc As mshtml.HTMLDocument = Me.Document
If (doc.styleSheets Is Nothing) Then Return
If (doc.styleSheets.length = 0) Then Return
Dim docStyleSheet As mshtml.IHTMLStyleSheet = CType(doc.styleSheets.item(0), mshtml.IHTMLStyleSheet)
Dim docStyleRules As mshtml.HTMLStyleSheetRulesCollection = CType(docStyleSheet.rules, mshtml.HTMLStyleSheetRulesCollection)
' Note: the following is needed seperately from 'Case "BODY"
Dim docBody As mshtml.HTMLBodyClass = CType(doc.body, mshtml.HTMLBodyClass)
If Not (docBody Is Nothing) Then
docBody.style.backgroundColor = colStrTextBg
End If
Dim i As Integer
Dim maxI As Integer = docStyleRules.length - 1
For i = 0 To maxI
Select Case (docStyleRules.item(i).selectorText)
Case "BODY"
docStyleRules.item(i).style.fontFamily = fName ' "Times New Roman" | "Verdana" | "courier new" | "comic sans ms" | "Arial"
Case "P.myStyle1"
docStyleRules.item(i).style.fontSize = fontSize.ToString & "pt"
Case "TD.myStyle2" ' do nothing
Case ".myStyle3"
docStyleRules.item(i).style.fontSize = fontSizePath.ToString & "pt"
docStyleRules.item(i).style.color = colStrTextFg
docStyleRules.item(i).style.backgroundColor = colStrTextBg
Case Else
Debug.WriteLine("Rule " & i.ToString & " " & docStyleRules.item(i).selectorText)
End Select
Next i
If (isRefresh) Then
Me.myRefresh(curNode)
End If
End Sub
Похоже, что phq испытал это. Я думаю, что я бы подошел, добавив ссылку на jquery в ваш html-документ (с самого начала).
Затем внутри страницы создайте функцию javascript, которая принимает идентификатор элемента и имя применяемого класса. Внутри функции используйте jquery для динамического применения рассматриваемого класса или для непосредственного изменения CSS. Например, используйте функции .addClass или .css jquery для изменения элемента.
Оттуда, в коде C #, после добавления элемента динамически вызывать этот javascript, как описано здесь Риком Стрелом: http://www.west-wind.com/Weblog/posts/493536.aspx
Я немного изменил ваш метод AddStyles (), и он у меня работает. Откуда вы звоните? Я вызвал это из "_webBrowser_DocumentCompleted".
Я должен отметить, что вызываю AddStyles после изменения DOM.
private void AddStyles()
{
try
{
if (_webBrowser.Document != null)
{
IHTMLDocument2 currentDocument = (IHTMLDocument2)_webBrowser.Document.DomDocument;
int length = currentDocument.styleSheets.length;
IHTMLStyleSheet styleSheet = currentDocument.createStyleSheet(@"", length + 1);
//length = currentDocument.styleSheets.length;
//styleSheet.addRule("body", "background-color:blue");
TextReader reader = new StreamReader(Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "basic.css"));
string style = reader.ReadToEnd();
styleSheet.cssText = style;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Вот мой обработчик DocumentCompleted (я добавил несколько стилей в basic.css для тестирования):
private void _webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
HtmlElement element = _webBrowser.Document.CreateElement("p");
element.InnerText = "Hello World1";
_webBrowser.Document.Body.AppendChild(element);
HtmlElement divTag = _webBrowser.Document.CreateElement("div");
divTag.SetAttribute("class", "categoryDiv");
divTag.InnerHtml = "<p>Hello World2</p>";
_webBrowser.Document.Body.AppendChild(divTag);
HtmlElement divTag2 = _webBrowser.Document.CreateElement("div");
divTag2.SetAttribute("id", "mainDiv2");
divTag2.InnerHtml = "<p>Hello World3</p>";
_webBrowser.Document.Body.AppendChild(divTag2);
AddStyles();
}
Это то, что я получил (изменил стиль, чтобы сделать его настолько уродливым, насколько может надеяться сделать один человек: D ):
Одно из решений - проверить HTML перед установкой DocumentText и внедрить CSS на стороне клиента. Я не устанавливаю свойство url элемента управления, а получаю HTML через WebCLient, а затем устанавливаю DocumentText. возможно, установка DocumentText (или в вашем случае Document) после того, как вы манипулируете DOM, может заставить его правильно повторно отрисоваться
private const string CSS_960 = @"960.css";
private const string SCRIPT_FMT = @"<style TYPE=""text/css"">{0}</style>";
private const string HEADER_END = @"</head>";
public void SetDocumentText(string value)
{
this.Url = null; // can't have both URL and DocText
this.Navigate("About:blank");
string css = null;
string html = value;
// check for known CSS file links and inject the resourced versions
if(html.Contains(CSS_960))
{
css = GetEmbeddedResourceString(CSS_960);
html = html.Insert(html.IndexOf(HEADER_END), string.Format(SCRIPT_FMT,css));
}
if (Document != null) {
Document.Write(string.Empty);
}
DocumentText = html;
}