【发布时间】:2019-07-30 21:06:04
【问题描述】:
我有一个正在 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.Document.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;
}
样式页面加载成功,但页面上唯一受影响的元素是页面中最初的元素(body 和 mainDiv)。我也尝试在标题部分的元素中包含 css,但它仍然只影响创建页面时存在的元素。
所以我的问题是,有没有人知道为什么 css 没有应用于页面加载后创建的元素?我也尝试在添加所有元素之前不应用 css,但结果不会改变。
【问题讨论】:
-
我也有同样的疑惑。我一直认为以这种方式创建网页只是创建了一个陈旧/死/静态页面,并且渲染引擎停止检查样式,除非页面中的元素导致渲染器“唤醒”。但我是凭空捏造的。我刚学会在最初创建文档时将 CSS 作为第一件事添加到头部。
-
我知道这可能根本没有帮助(这就是为什么它是一个评论),但我想从经验告诉你 C# 的 WebBrowser 组件是垃圾。看似微不足道的事情往往会让人头疼,当它不能满足您的要求时,您通常最终不得不转到底层的 ActiveX 组件……至少可以说是一团糟(大约 5 个不同的界面完全无组织,具有任意功能集)。我强烈推荐尽可能使用不同的浏览器组件,例如基于 Firefox 引擎的 GeckoFX。
-
这里缺少一条关键信息:您正在创建的元素,以及没有样式化的元素。据推测,您将 class 属性设置为
"categoryDiv"、"categoryTable"等...但是,您的问题中没有明确说明。鉴于您所描述的结果,我更倾向于相信您的元素创建中存在一个错误,而不是任何与您的样式表创建直接相关的错误。话虽如此,您确实意识到您正在强制新样式表成为文档中的第一个(因此是最低优先级),对吧? -
@Shog9:我怀疑你是对的。我创建了 James 项目的测试版本,并且可以很好地将样式应用于新元素(给定一些小模块)。
-
@Andre:呵呵,我也是这样做的,结果是一样的。答案很好!
标签: c# css webbrowser-control