2010-06-17 2 views
1

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

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

Заранее благодарен!

ответ

1

Вы можете использовать встроенные в 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

Привет, Ray, я использую эту реализацию с новым вопросом, который у меня есть здесь. Http://stackoverflow.com/questions/3098383/previewmouseleftbuttondown-not-firing - Хотелось бы выбрать ваш мозг, чтобы узнать, есть ли у вас какие-либо идеи о почему у меня проблемы. Еще раз спасибо за помощь! – TheGeekYouNeed

0

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

+0

Ищете что-то вроде DisplayNext() или что-то уже реализованное - на случай, если я пропустил что-то действительно простое. Я собирался реализовать ScrollIntoView, но хотел убедиться, прежде чем я это сделал. Спасибо за ответ. – TheGeekYouNeed

+0

Этот ответ неверен или, по крайней мере, вводит в заблуждение. Вы можете использовать ScrollViewer.PageUp() и ScrollViewer.PageDown(), чтобы выполнять именно то, что вы просите. Я просто написал ответ, объясняющий, как это сделать. –

+0

Держите Рэй. Почему вы говорите, что это неправильно? Это более общее, да, но это не так. – Anvaka

Смежные вопросы