我有一个Windows窗体应用程序,它使用WebBrowser
控件来显示嵌入式网页。使用以下方法(成功)加载文件:
webHelp.DocumentStream=
Assembly.GetExecutingAssembly()
.GetManifestResourceStream("MyAssembly.help.html");
为了使其正常工作(即要加载/显示的文件),我设置了webHelp.AllowNavigation = false;
。我不完全理解为什么,但如果设置为true,则不显示页面。
在我的HTML文档中(见下文)我希望能够通过不同的部分进行导航。但是当我点击链接时,浏览器控件不会转到目标元素。该网页在独立的Internet Explorer 10中运行良好,因此它必须与控件有关,更具体地说是AllowNavigation
属性。 MSDN没有多大帮助。
如何实现此导航行为?是否有另一种加载HTML文件的方法,而不将AllowNavigation
属性设置为false?
这是我的简单HTML文件:
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>Using this tool</title>
</head>
<body>
<h3>Description</h3>
<div><p id="contents">Contents</p></div>
<div>
<p id="general">Using the file converter</p>
<p>*converter description*</p>
<a href="#contents" class="goToTop">Go To Top!</a>
</div>
<div class="divBlock" >
<p id="selectOption">Selecting a conversion action</p>
<p>*action selection*</p>
<a href="#contents" class="goToTop">Go To Top!</a>
</div>
</body>
</html>
编辑:经过额外测试后,我找到了问题的根源。设置URL
属性的值,运行应用程序并随后清除此值后,出现问题。除非AllowNavigation
属性设置为false
,否则不再加载嵌入页面。有两种解决方案,我的答案如下所述。
答案 0 :(得分:0)
我也有自己的WebBrowser。我已经测试过了,它可以完美地加载你的HTML文件。 我只是用过:
webBrowser1.Navigate("C:\\myPath\\SofNavigate.html");
当我点击链接时,它会毫无问题地转到“#contents”。 我不确定为什么你需要使用webHelp.Docstream而不是简单的Navigate。 顺便说一句,当我关闭导航,然后我无法从我开始的页面去任何地方。因此,导航必须才能从“主页”转到任何位置。
尝试调试该部分,因为它似乎是您遇到的更大问题。 关于如何设置简单的webBrowser,这是一个很好的example。尝试使用它作为基础,看看你做了什么不同,搞砸了你的导航。
答案 1 :(得分:0)
[已编辑] Win8 / IE10,您的代码在Form.Load
事件内部未经修改就可以在一个简单的表单上进行修改,该表单只有一个WebBrowser
控件并具有所有默认设置(默认情况下WebBrowser.AllowNavigation
为true
。检查Designer中WebBrowser
控件的属性,可能会出现问题。
[/ EDITED]
您正在使用HTML5,它通过id
属性处理锚链接(即<p id="contents"> ... <a href="#contents">
。默认情况下,WebBrowser
控件在旧版IE7模式下工作且HTML5已停用。您需要转向在WebBrowser
对象创建之前,使用FEATURE_BROWSER_EMULATION功能控件启用它。执行此操作的最佳位置是表单的static
构造函数:
static MainForm()
{
SetBrowserFeatureControl();
}
private static void SetBrowserFeatureControl()
{
// http://msdn.microsoft.com/en-us/library/ee330730(v=vs.85).aspx#browser_emulation
// FeatureControl settings are per-process
var fileName = System.IO.Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName);
// make sure the control is not running inside Visual Studio Designer
if (String.Compare(fileName, "devenv.exe", true) == 0 || String.Compare(fileName, "XDesProc.exe", true) == 0)
return;
// web pages containing standards-based !DOCTYPE directives are displayed in Standards mode
using (var key = Registry.CurrentUser.CreateSubKey(
@"Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION",
RegistryKeyPermissionCheck.ReadWriteSubTree))
{
key.SetValue(fileName, (UInt32)9000, RegistryValueKind.DWord);
}
}
尝试一下,您的链接应该按预期工作。此解决方案不需要管理员权限,受影响的密钥位于HKEY_CURRENT_USER
下。
[更新] 可能有一个更好的解决方案,它至少适用于我这边的IE10。如下所示添加<meta http-equiv="X-UA-Compatible" content="IE=edge" />
并保持注册表完好无损。如果您看到document.compatMode: CSS1Compat, document.documentMode: 10
,那么您应该很高兴,但也要使用较旧的IE版本进行测试。
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title></title>
<script type="text/javascript">
window.onload = function () {
info.firstChild.data =
"document.compatMode: " + document.compatMode +
", document.documentMode: " + document.documentMode;
}
</script>
</head>
<body>
<pre id="info"> </pre>
</body>
</html>
答案 2 :(得分:0)
编辑:找到问题原因后(请参阅问题编辑)我现在可以提出三个解决方案:
<强> 1。 WebBrowser
控件更换:
只需删除现有的WebBrowser
控件并添加一个新控件即可。此解决方案不需要对AllowNavigation
属性进行任何修改。请勿修改URL
属性。
<强> 2。删除和添加新WebBrowser
控件时不能选择:
由于AllowNavigation
属性影响了网页的加载和显示,因此没有理由将其留给false
。在Shown
事件中重新设置属性解决了导航问题,无需其他更改(例如在HTML文件或注册表中):
private void helpForm_Shown(object sender, EventArgs e)
{
webHelp.AllowNavigation = true;
}
第3。重新设定Document
如果Document
属性一次设置并重置,则URL
属性得到(自动)初始化。在加载资源流之前添加webHelp.Document.OpenNew(true);
可以解决问题,而无需重新添加WebBrowser
并且无需修改AllowNavigation
属性。