1

WebBrowserコントロールを使用して埋め込み Web ページを表示するWindows フォーム アプリケーションがあります。ファイルは(正常に)次を使用してロードされます。

webHelp.DocumentStream=
          Assembly.GetExecutingAssembly()
          .GetManifestResourceStream("MyAssembly.help.html");

これが機能するように (つまり、ファイルをロード/表示するために) webHelp.AllowNavigation = false;、. 理由はよくわかりませんが、trueにするとページが表示されません。

私の HTML ドキュメント (以下を参照) で、さまざまなセクションをナビゲートできるようにしたいと考えています。しかし、リンクをクリックすると、ブラウザー コントロールが対象の要素に移動しません。Web ページはスタンドアロンの Internet Explorer 10 で正常に動作するため、コントロール、より具体的にはAllowNavigationプロパティと何らかの関係があるはずです。MSDN はあまり役に立ちませんでした。

このナビゲーション動作を実現するにはどうすればよいですか? AllowNavigationプロパティを falseに設定せずに HTML ファイルをロードする別の方法はありますか?

これは私の単純な 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。以下の私の回答で説明されている2つの解決策があります。

4

3 に答える 3

0

[編集済み] Win8/IE10、あなたのコードは、すべてのデフォルト設定を備えた単一のコントロールをForm.Load持つ単純なフォームのイベント内で変更されずに機能します(デフォルトです)。デザイナーでコントロールのプロパティを確認してください。何か問題がある可能性があります。[/編集済み]WebBrowserWebBrowser.AllowNavigationtrueWebBrowser

属性を介してアンカー リンクを処理する HTML5 を使用していidます (つまり<p id="contents"> ... <a href="#contents">、デフォルトでは、コントロールは HTML5 が無効になっているレガシー IE7 モードで動作します。オブジェクトが作成される前に、 FEATURE_BROWSER_EMULATION機能コントロールでWebBrowser有効にする必要があります。これを行うのに最適な場所です)。あなたのフォームのコンストラクタです:WebBrowserstatic

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

編集:問題の原因を見つけた後 (質問の編集を参照)、3 つの解決策を提案できるようになりました。

1.WebBrowserコントロールの置き換え:
既存のコントロールを削除してWebBrowser、新しいコントロールを追加するだけです。AllowNavigationこのソリューションでは、プロパティを変更する必要はありません。URLプロパティを変更しないでください。

2. 新しいコントロールの削除と追加がWebBrowserオプションではない場合:
プロパティは Web ページの読み込みと表示に影響を与えていた ため、後AllowNavigationから残す理由はありませんでしfalseた。イベントでプロパティを元に戻すと、Shown他の変更 (HTML ファイルやレジストリなど) を必要とせずに、ナビゲーションの問題が解決されました。

private void helpForm_Shown(object sender, EventArgs e)
{
    webHelp.AllowNavigation = true;
}

3.Documentリセット プロパティが一度に設定およびリセットされると
Documentプロパティが (自動的に) 初期化されるようになっています。URLリソース ストリームをロードする前に追加すると、プロパティを変更せずwebHelp.Document.OpenNew(true);に再追加する必要なく、問題が解決します。WebBrowserAllowNavigation

于 2013-11-05T07:38:20.503 に答える
0

私も独自の WebBrowser を持っています。テストしたところ、HTML ファイルが完全に読み込まれます。私は単に使用しました:

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

リンクをクリックすると、問題なく「#contents」に移動します。単純なナビゲートの代わりに webHelp.Docstream を使用する必要がある理由がわかりません。ところで、ナビをオフにすると、最初のページからどこにも行けなくなりました。そのため、「ホームページ」からどこにでも移動するには、ナビゲーションがオンになっている必要があります。

あなたが抱えているより大きな問題のように見えるので、その部分をデバッグしてみてください。簡単な webBrowser をセットアップする方法の良い例を次に示します。それをベースとして使用して、ナビゲーションを台無しにする別の方法を確認してください。

于 2013-11-04T16:18:23.223 に答える