何かトリッキーなことをしようとしています。ScrollViewer
がスクロールされているかどうか、およびアイテムが の中央にあるかどうかを判断して、リスト アイテムを選択したいと考えていますScrollViewer
。ユーザーが 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;
}
}
}
}
ScrollViewOnViewChanged
scrollviewer がまだスクロールしているかどうかを判断するイベントを処理します。ここで、 の位置を決定して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");
}
ありがとう!どんな助けでも大歓迎です!