问题:
我正在运行带有嵌入式WebBrowser控件的winforms应用程序。我已经使用魔术注册表设置将此Control切换到IE 8模式(这里回答Will the IE9 WebBrowser Control Support all of IE9's features, including SVG?)。
但是现在如果我导航到包含Meta标签的网站X-UA-Compatible IE = 9(从http://msdn.microsoft.com/en-us/library/cc288325(v=vs.85).aspx开始),我的webbrowser控件将切换到IE9模式并忽略注册表设置。
我希望我的控制能够保持在IE8模式......
我的解决方案尝试
我尝试在使用IHTMLDOMNode.removeChild加载控件(Document_complete)后删除元标记,但控件不会重新呈现页面。
我尝试手动加载HTML内容(使用WebClient),删除元标记并将其提供到webbrowser控件(使用Document.Write或DocumentText),但这样控件拒绝加载任何其他内容(像图像)。
帮助
现在我没有想法编写我自己的HTTPProxy并修改路上的响应(我不想这样做)。
任何想法?
我正在使用.Net 4,我无法更改将要显示的网站,无论X-UA兼容标签如何,我都需要在IE8模式下进行渲染...
谢谢!
答案 0 :(得分:3)
我也遇到了DocumentText
的问题 - 我放弃了它。
我的解决方案是编写进程内HTTP服务器并将WebBrowser
指向该位置。
我在这里写了一篇关于它的文章:http://SimplyGenius.net/Article/WebBrowserEx
在我的情况下,我从文件系统获取内容。
您必须更改它以拨打您的目标网站,但它不应该太多工作。
然后,您可以根据需要修改HTML,链接仍然有效。
答案 1 :(得分:2)
不知道如何使WebBrowser控件忽略该标记而不覆盖您的注册表设置。对于快速(脏)的解决方法,您可以执行以下操作。
为要在WebBrowser控件中显示的站点创建请求。
var requestUri = new Uri("http://stackoverflow.com/");
var request = (HttpWebRequest) WebRequest.Create(requestUri);
得到答复。
var response = request.GetResponse();
using (var stream = response.GetResponseStream())
using (var reader = new StreamReader(stream))
{
var html = reader.ReadToEnd();
//...
}
使用NuGet安装HTMLAgilityPack。
http://nuget.org/packages/HtmlAgilityPack
将刚刚检索到的HTML加载到HtmlDocument实例中。
var document = new HtmlAgilityPack.HtmlDocument();
document.LoadHtml(html);
选择标记。在这里,我使用StackOverflow.com作为示例,并选择其样式表节点。找到后,只需删除节点。
var nodes = document.DocumentNode.SelectNodes("//link[@rel=\"stylesheet\"]");
foreach(var node in nodes)
{
node.ParentNode.RemoveChild(node);
}
剩下的就是检索修改后的HTML并将其直接提供给WebBrowser控件。
html = document.DocumentNode.OuterHtml;
webBrowser.DocumentText = html;
它无法解释那里没有的东西。
您也可以这样做来解决您的问题。发出请求,获取响应,修改HTML并将其提供给WebBrowser控件。测试它,似乎加载文件的其余部分确定。