2

何かトリッキーなことをしようとしています。ScrollViewerがスクロールされているかどうか、およびアイテムが の中央にあるかどうかを判断して、リスト アイテムを選択したいと考えていますScrollViewer。ユーザーが ListView の中央に手動でスクロールしたときに項目を選択したいと考えています。選択したアイテムまでスクロールしたくありません。簡単すぎるからですよね?

ここに図があります:

縦の ListView で常に中央の項目を選択する

スクローラーがスクロールされたかどうかを検出できました。最初に、問題の「itemsList」の ListView に Loaded Event を配置ScrollViewerし、ビジュアル ツリーをトラバースしてスクロールが終了したかどうかを確認ScrollViewerし、ListView にタグを付けて、SelectionChanged イベントを処理することでタイプを見つけます。

private void ItemsList_OnLoaded(object sender, RoutedEventArgs e)
{
  var listView = (sender as ListView);
  if (listView != null)
  {
    var scrollers = FindVisualChildren<ScrollViewer>(sender as DependencyObject);
    var scrollView = scrollers.First();
    if (scrollView != null)
    {
      scrollView.Tag = listView;
      scrollView.ViewChanged += ScrollViewOnViewChanged;
      listView.SelectionChanged += listView_SelectionChanged;
    }
  }
}

public IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
  if (depObj != null)
  {
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
    {
      DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
      if (child != null && child is T)
      {
        yield return (T)child;
      }

      foreach (T childOfChild in FindVisualChildren<T>(child))
      {
        yield return childOfChild;
      }
    }
  }
}

ScrollViewOnViewChangedscrollviewer がまだスクロールしているかどうかを判断するイベントを処理します。ここで、 の位置を決定してListViewItem選択する必要があるいくつかの問題に直面しています。ここで助けていただければ幸いです。

private void ScrollViewOnViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
{
  //Debug.WriteLine("ScrollViewOnViewChanged + IsIntermediate="+e.IsIntermediate);

  var scrollviewer = sender as ScrollViewer;
  var listview = scrollviewer.Tag as ListView;

  if (!e.IsIntermediate)
  {
    Debug.WriteLine("IsIntermediate = false");
    // TODO: Determine the center Item and set is as the selected item for this group.
  }
}

次に、SelectionChanged私がいくつかの魔法を起こすイベント:

void listView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
  Debug.WriteLine("SelectionChanged");
}

ありがとう!どんな助けでも大歓迎です!

4

1 に答える 1

0

の方法InputHitTestで真ん中のアイテムを手に入れることができますScrollViewer

例:

IInputElement element = scrollViewer.InputHitTest(
    new Point(scrollViewer.Width / 2, scrollViewer.Height / 2));
于 2013-02-12T01:24:25.443 に答える