使用嵌入式Web浏览器浏览网页的对象

时间:2013-11-04 15:57:08

标签: c# html winforms webbrowser-control

我有一个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,否则不再加载嵌入页面。有两种解决方案,我的答案如下所述。

3 个答案:

答案 0 :(得分:0)

我也有自己的WebBrowser。我已经测试过了,它可以完美地加载你的HTML文件。 我只是用过:

webBrowser1.Navigate("C:\\myPath\\SofNavigate.html");

当我点击链接时,它会毫无问题地转到“#contents”。 我不确定为什么你需要使用webHelp.Docstream而不是简单的Navigate。 顺便说一句,当我关闭导航,然后我无法从我开始的页面去任何地方。因此,导航必须才能从“主页”转到任何位置。

尝试调试该部分,因为它似乎是您遇到的更大问题。 关于如何设置简单的webBrowser,这是一个很好的example。尝试使用它作为基础,看看你做了什么不同,搞砸了你的导航。

答案 1 :(得分:0)

[已编辑] Win8 / IE10,您的代码在Form.Load事件内部未经修改就可以在一个简单的表单上进行修改,该表单只有一个WebBrowser控件并具有所有默认设置(默认情况下WebBrowser.AllowNavigationtrue。检查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">&nbsp;</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属性。