C#:最好的方式注入到CSS MSHTML实例?
-
22-08-2019 - |
题
我想要注入一些CSS附带一些其他HTML到C#托管WebBrowser控件。我试图经由底层MSHTML(的DomDocument属性)控制要做到这一点,因为此代码被用作一个完整的IE8 BHO原型各种各样的。
的问题是,虽然我可以注入HTML(经由mydomdocument.body.insertAdjacentHTML)和Javascript(通过mydomdocument.parentWindow.execScript),它是平坦的出拒绝我的CSS代码。
如果我比较包含我想和注射后的目的地网页的源代码插入HTML的字符串时,MSHTML的源将字面上包含所有的除了的为<style>
元素及其底层源。
在CSS通行证CSS 2.1 W3C验证。它不执行任何操作太麻烦,不同之处在于一些背景图像属性有图像直接嵌入到CSS(例如background-image: url("data:image/png;base64
...),和注释出这些行不改变的结果。
更奇怪的是(和我不知道这是否是相关的),是,我是有这个上周没有问题。这周我回来给它,切换周围的一些实际的注射前处理,以待注入HTML的代码后,就不再工作。当然,我认为我的一个变化,都可能是问题,但评论出所有逻辑和喂养它直串的HTML仍然出现未格式化。之后
目前我注入<body>
标签,虽然我已经试图注入<head>
而这会见了类似的结果。
在此先感谢您的帮助!
汤姆
解决方案
弄成解决自己:
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作为实现是几乎相同搞清楚了这一点。
不隶属于 StackOverflow