2009-04-02 1 views
3

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

Проблема заключается в том, что я могу вставлять 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>, и это встречается с аналогичными результатами.

Заранее благодарим за вашу помощь!

Том

ответ

15

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

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, поскольку реализации в значительной степени идентичны.

+0

Удивительный человек решения! +++ –

Смежные вопросы