-1

ローカルでhtmlファイルを読み込んでいますが、これらの「.html」ファイルは「file.html#xxxxx」という形式で内部的に分割されています。これらのファイルを Web ブラウザーに表示していますが、「#」が原因で指定されたパスを受け入れません。

私は epub 本を読んでいます。その章は内部で「#」で区切られています。解析後、章ごとに独自のパーティションを取得し、このパーティションは # で示されます。

これは分割の例です

<navMap>
    <navPoint id="np-1" playOrder="1">
      <navLabel>
        <text>YOUR NATIONAL PARKS BY ENOS A. MILLS</text>
      </navLabel>
      <content src="@public@vhost@g@gutenberg@html@files@42248@42248-h@42248-h-0.htm.html#pgepubid00000"/>
      <navPoint id="np-2" playOrder="2">
        <navLabel>
          <text>PREFACE</text>
        </navLabel>
        <content src="@public@vhost@g@gutenberg@html@files@42248@42248-h@42248-h-0.htm.html#pgepubid00001"/>
      </navPoint>
      <navPoint id="np-3" playOrder="3">
        <navLabel>
          <text>CONTENTS</text>
        </navLabel>
        <content src="@public@vhost@g@gutenberg@html@files@42248@42248-h@42248-h-0.htm.html#pgepubid00002"/>
      </navPoint>
</navMap>

および表示するには:

  navPoint = toc.NavMap[0];
 string srcContent = navP.Src;
    webBrowser1.Source= path+srcContent
4

1 に答える 1

0

答えをできるだけきれいに保ちたいので、答えを完全に書き直しました。次の手順を実行する必要があると思います。

  • 呼び出されたイベントにサブスクライブしNavigatingDocumentCompleted
  • コードを使用して URL を解析し、#
  • ナビゲーションをオーバーライドし、WebBrowser にアンカーなしの新しいクリーンな URL を与える
  • たとえば、アンカーを変数に格納しました
  • ドキュメントがロードされた後、アンカーによって参照されている要素を見つけてスクロールするだけです

結果はおそらくこのようになります。これはコピー アンド ペースト コードではないことに注意してください。目的を達成する方法を示したいだけです。このコードを必要に応じて変更する必要があります。

リクエストされたURLがmyFile.html#customAnchor

webBrowser1.Navigating += new WebBrowserNavigatingEventHandler(webBrowser1_Navigating);
webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
    if (e.Url.Contains("#")
    {
       string[] urlParts = e.Url.Split('#'); // split the string by character #
       string newUrl = urlParts[0];          // = myFile.html
       _somePrivateField = urlParts[1];      // = customAnchor

       webBrowser1.Navigate(new Uri(newUrl));
    }
}

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    HtmlElementCollection elements = this.webBrowser1.Document.Body.All;
    foreach(HtmlElement element in elements){
       string nameAttribute = element.GetAttribute("Name");
       if(!string.IsNullOrEmpty(nameAttribute) && nameAttribute == _somePrivateField){
          element.ScrollIntoView(true);
          break;
       }
    }
}

実際にこれを試したことはありませんが、これが問題を解決するのに十分役立つことを願っています.

于 2013-03-20T20:42:31.770 に答える