1

我有一个 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。我在下面的回答中描述了两种解决方案。

4

3 回答 3

0

我也有自己的 WebBrowser。我已经对其进行了测试,它可以完美地加载您的 HTML 文件。我只是使用:

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

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

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

于 2013-11-04T16:18:23.223 回答
0

[编辑] Win8/IE10,你的代码Form.Load在一个简单的表单上为我工作,未经修改的内部事件,它只有一个WebBrowser具有所有默认设置的控件(默认WebBrowser.AllowNavigation情况true下)。检查设计器中控件的属性WebBrowser,您可能在那里有问题。
[/编辑]

您正在使用HTML5,它通过属性(id<p id="contents"> ... <a href="#contents">.是您的表单的构造函数:WebBrowserWebBrowserstatic

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>
于 2013-11-04T21:08:43.777 回答
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如果属性被一次设置和重置,则重置属性得到(自动)初始化的
It接缝。在加载资源流之前添加可以解决问题,无需重新添加和修改属性。DocumentURLwebHelp.Document.OpenNew(true);WebBrowserAllowNavigation

于 2013-11-05T07:38:20.503 回答