C #: Лучший способ внедрить CSS в экземпляр MSHTML? - PullRequest
3 голосов
/ 02 апреля 2009

Я пытаюсь внедрить некоторый CSS, который сопровождает другой HTML, в управляемый C # элемент управления WebBrowser. Я пытаюсь сделать это через базовый элемент управления MSHTML (свойство DomDocument), так как этот код служит своего рода прототипом для полного IE8 IE8.

Проблема в том, что, хотя я могу вставлять HTML (через mydomdocument.body.insertAdjacentHTML) и Javascript (через mydomdocument.parentWindow.execScript), он категорически отвергает мой код CSS.

Если я сравниваю строку, содержащую HTML, который я хочу вставить, с источником страницы назначения после внедрения, источник MSHTML будет буквально содержать все , кроме для элемента <style> и его основного источника.

CSS проходит проверку W3C для CSS 2.1. Он не делает ничего сложного, за исключением того, что в некоторых свойствах фонового изображения изображение напрямую встроено в CSS (например, background-image: url("data:image/png;base64 ...), а комментирование этих строк не меняет результат.

Более странно (и я не уверен, что это актуально), было то, что у меня не было проблем с этим на прошлой неделе. Я вернулся к этому на этой неделе, и после переключения кода, который обрабатывает HTML-код, который должен быть введен перед фактическим внедрением, он больше не работал. Естественно, я думал, что одно из моих изменений может как-то быть проблемой, но после того, как я закомментировал всю эту логику и представил ее в виде прямой строки, HTML-код все еще выглядит неформатированным.

В настоящий момент я делаю инъекцию в тег <body>, хотя я пытался внедрить в <head>, и это привело к аналогичным результатам.

Заранее спасибо за помощь!

1021 * Том *

1 Ответ

15 голосов
/ 05 апреля 2009

Закончил, решая это сам:

mshtml.HTMLDocument test = (mshtml.HTMLDocument)webBrowser1.Document.DomDocument;

//inject CSS
if (test.styleSheets.length < 31) { // createStyleSheet throws "Invalid Argument if >31 stylesheets on page

    mshtml.IHTMLStyleSheet css = (mshtml.IHTMLStyleSheet)test.createStyleSheet("", 0);
    css.cssText = myDataClass.returnInjectionCSS(); // String containing CSS to inject into the page
        // CSS should now affect page

} else {
    System.Console.WriteLine("Could not inject CSS due to styleSheets.length > 31");
    return;
}

Чего я не понял, так это того, что createStyleSheet создает указатель, который все еще «жив» в DOM документа ... поэтому вам не нужно добавлять созданную таблицу стилей обратно к ее родителю. В итоге я понял это, изучая динамический код CSS для Javascript, поскольку реализации в значительной степени идентичны.

...