ゴミ箱.net

汚物は消毒

WebBrowserコントロールのスクロール位置を保持する

WebBrowserコントロールは、.NET Frameworkのコンポーネントのひとつで、その名のとおりウェブブラウザとしての機能を持つ。
HTMLで記述したテキストをプロパティDocumentTextに設定することで、簡単にHTMLを整形して表示させることができるすぐれものである。

WebBrowserコントロールを使って表示を行うとき、基本的にページを再読み込みするとスクロール位置がリセットされてしまうが、そういう場合にスクロール位置を保ちたい場合がある。
自作ツールでプレビューにWebBrowserを使っているのだが、データを更新するたびに見たい位置にスクロールさせるのが面倒なのだ。

そんな場合どうする?


そもそもWebBrowserのスクロール位置を取得・設定する方法が分からないのだが…まずそれを調べてみる。

WebBrowserには、プロパティDocument.Body.ScrollLeftおよびDocument.Body.ScrollTopが存在し、これがX、Yそれぞれの方向のスクロール位置を表している。(Documentがnullになるときがあるので注意。)
ならばこれらの値を、読み込みの直前で変数に退避し、読み込み完了直後に戻してやればいいのではないか?
そう考えた結果がこれだよ!


まず、ページを再読み込みさせる処理の前に以下のようなコードを挿入し、スクロール位置をクラス変数に退避する。
ただし、WebBrowserコントロールの名前をwebBrowserとする。m_webBrowserScrollLeftおよびm_webBrowserScrollTopは、int型のクラスのメンバ変数とする。

if (webBrowser.Document != null)
{
m_webBrowserScrollLeft = webBrowser.Document.Body.ScrollLeft;
m_webBrowserScrollTop = webBrowser.Document.Body.ScrollTop;
}

//ここでwebBrowser.DocumentText = converter.Convert(m_data);などの再読み込みをする処理が入る


次に、WebBrowserのイベントDocumentCompletedにイベントハンドラを定義する。このイベントは、再読み込みが完了した直後に発生する。
private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
}


最後に、このイベントハンドラの中において、クラス変数に退避しておいたスクロール位置をWebBrowserコントロールに戻してやる。
private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
webBrowser.Document.Body.ScrollLeft = m_webBrowserScrollLeft;
webBrowser.Document.Body.ScrollTop = m_webBrowserScrollTop;
}


これで、いくら再読み込みをしてもスクロール位置がリセットされないWebBrowserコントロールの完成である。
スポンサーサイト

PageTop

コメント


管理者にだけ表示を許可する