0

.Net 4.0 WebBrowser (System.Windows.Controls から) を使用しています。私のアプリケーションでは、ユーザーは html データを変更でき、Web ブラウザーに更新が表示されます。アプリケーションは、表示されていた前の要素に自動的にスクロールする必要があります。

Windows 7 で WPF / c# 4.0 を使用しています。

詳細に:

  • コードでは、WebBrowser.NavigateToString(htmlData1); を呼び出します。
  • ユーザーが任意の位置にスクロールする
  • ユーザーが (どういうわけか) html ドキュメントを変更する
  • ここで、表示される最初の html 要素を見つけたい (そして覚えておきたい)
  • 私は WebBrowser.NavigateToString(htmlData2); を呼び出します。
  • 今、記憶された要素を使用してhtmlドキュメントを自動的にスクロールしたいと思います(これを行うには IHTMLElement.scrollIntoView() があることを知っています)

問題は、WebBrowser で最初に表示される html 要素を取得するにはどうすればよいかということです。

更新された html にはもう記憶された要素がないと言うかもしれません。右。しかし、ドキュメントにタイムスタンプがあり、記憶された html 要素を使用して、新しい html ドキュメント内の最適な位置を見つけます。

4

1 に答える 1

0

適切な使用方法を見つけたと思います。ドキュメントが更新されているときにスクロール位置を保持するには、実際には 2 つの可能性があります。

次のメンバーを想定します。

WebBrowser _browser;
HTMLDocument HtmlDoc { get { return (HTMLDocument)_browser.Document; } }

(1) ドキュメントが実際には変更されていない場合 (私の例ではスタイルのみが変更されています)、更新後に現在のスクロール位置を使用して自動スクロールします。

  • リフレッシュ前:

    _scrollPos = ((IHTMLElement2)(HtmlDoc.documentElement)).scrollTop;
    
  • リフレッシュ後:

    HtmlDoc.parentWindow.scrollTo(0, _scrollPos);
    

(2) ドキュメントが変更された場合、ドキュメントの左上の要素 (既知の構造) を使用します。

  • リフレッシュ前:

    IHTMLElement el = HtmlDoc.elementFromPoint(50, 0);
    

    その el (ドキュメントの知識が必要) を使っていくつかの魔法を行い、更新後に最適な要素を検索するために使用できる文字列を覚えておいてください。

    string beforeRefresh = fromElement(el);
    
  • 更新後、記憶された文字列を使用して、リロードされた html ドキュメントで最適な html 要素を検索します。

    IHTMLElement newEl = fromString(beforeRefresh);
    newEl.scrollIntoView(true);
    

したがって、私が見逃していた実際のメソッドは elementFromPoint() でした。あとは「カスタムロジック」です。

于 2013-07-21T18:50:16.593 に答える