Прокрутите панель виртуализации ListBox с помощью кнопок - PullRequest
1 голос
/ 17 июня 2010

У меня есть список, отображающий 5 элементов одновременно, по горизонтали.Я хочу реализовать кнопки «Назад» и «Далее», которые при нажатии отображают предыдущий набор из 5 или следующий набор из 5 элементов.Я не отображаю горизонтальную полосу прокрутки, так как не хочу, чтобы пользователь перемещался по ней.

Уже реализована некоторая функциональность, поэтому я могу это сделать или мне нужно написать код, чтобы вычислить, чтоотображаемые элементы и т. д. в событиях нажатия кнопки?

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 17 июня 2010

Вы можете использовать встроенные команды ScrollViewer.PageUp () и ScrollViewer.PageDown (), например:

public void ShowNextPage()
{
   InvokeOnScrollViewer(listBox, viewer => viewer.PageDown());
}

public void ShowPriorPage()
{
   InvokeOnScrollViewer(listBox, viewer => viewer.PageUp());
}

public void InvokeOnScrollViewer(ItemsControl control, Action<ScrollViewer> action)
{
  for(Visual vis = control as Visual; VisualTreeHelper.GetChildCount(vis)!=0; vis = VisualTreeHelper.GetChild(vis, 0))
    if(vis is ScrollViewer)
    {
      Action((ScrollViewer)vis);
      break;
    }
}

Как это работает: InvokeOnScrollViewer сканирует визуальное дерево, пока не найдет ScrollViewerзатем вызывает для него заданное действие, а именно PageUp () или PageDown ().

Когда ваша ItemsPanel является StackPanel (либо с ориентацией, либо с виртуализацией, либо нет), ScrollViewer.PageUp () перемещается назад наодин видовой экран и ScrollViewer.PageDown () перемещается вперед на один видовой экран.Другими словами, если ваш ListBox показывает пять элементов, то эти команды перемещают его на пять элементов.

0 голосов
/ 17 июня 2010

Посмотрите на ListBox.ScrollIntoView () метод.

...