本サイトでは、アフィリエイト広告およびGoogleアドセンスを利用しています。

WPF の ListView で選択項目を中央にしたスクロール制御

ListView で選択された項目をコントロールの中央に表示したいと思うことがあります。今回はこれを実現するべく実装を考えてみました。考え方としては ListView が持っている ScrollViewer を制御して、スクロールを制御することにしました。

結果

実装した結果を示します。作成したアプリの動きとしては次のようになっています。

  • 選択状態にあるものを画面外にスクロールさせたとして、”アジャスト”ボタンを押すと、その項目が中央になるように表示
  • 項目の番号を指定して”選択”ボタンを押すと、対象の項目を選択状態にして、その項目が中央になるように表示

実装

まずは ListView の中から ScrollViewer のコントロールを扱うためのヘルパ関数を準備します。以下のような VisualTreeHelperExtensions を作成しました。

これを用いて、 ListView のコントロールから ScrollViewer を得ます。ここで listView は ListView コントロールにつけてある名前です。

var scrollViewer = listView.GetFirstDescendantsOfType();

この scrollViewer の ScrollToVerticalOffset メソッドを呼び出してスクロールさせたいのですが、どのくらいスクロールが必要なのかを、 ListView の選択項目のインデックス値から求めることにします。
以下のようなコードになりましたが、エラーハンドリングは省略しているのでご注意ください。

private void ScrollToSelected()
{
  var scrollViewer = listView.GetFirstDescendantsOfType();
  double halfList = scrollViewer.ViewportHeight / 2;
  var item = listView.SelectedItem;
  var index = listView.Items.IndexOf(item);
  double scrollOffset = index - halfList;
  if (scrollOffset > scrollViewer.ScrollableHeight)
  {
      scrollOffset = scrollViewer.ScrollableHeight;
  }
  scrollViewer.ScrollToVerticalOffset(scrollOffset);
}
プログラミング
すらりんをフォローする
すらりん日記
タイトルとURLをコピーしました