Проблема здесь на самом деле не в ListBox , а в ScrollViewer внутри его шаблона управления; поэтому, чтобы сделать цикл предметов, вам нужно каким-то образом изменить ScrollViewer . Я написал элемент управления, производный от ScrollViewer , который циклически перемещается в вертикальном направлении ... но должно быть легко увидеть, как заставить его работать и в горизонтальном направлении.
public class CyclicScrollViewer : ScrollViewer
{
public CyclicScrollViewer()
{
this.CommandBindings.Add(new CommandBinding(ScrollBar.LineUpCommand, LineCommandExecuted));
this.CommandBindings.Add(new CommandBinding(ScrollBar.LineDownCommand, LineCommandExecuted));
}
private void LineCommandExecuted(object sender, ExecutedRoutedEventArgs e)
{
if (e.Command == ScrollBar.LineUpCommand)
{
if (this.VerticalOffset == 0)
this.ScrollToEnd();
else
this.LineUp();
}
if (e.Command == ScrollBar.LineDownCommand)
{
if (this.VerticalOffset == this.ScrollableHeight)
this.ScrollToTop();
else
this.LineDown();
}
}
}
Методы ScrollTo ... и Line ... уже существуют в ScrollViewer , что делает кодирование довольно простым. Все, что я здесь делаю, - проверяю текущее смещение относительно границ зрителя перед прокруткой.
Следующим шагом является вставка нового ScrollViewer в шаблон элемента управления для целевого элемента управления, в данном случае ListBox . Вот фрагмент кода XAML, чтобы продемонстрировать это.
<ControlTemplate x:Key="{x:Type ListBox}" TargetType="ListBox">
...
<l:CyclicScrollViewer
Padding="{TemplateBinding Control.Padding}"
Focusable="False">
<ItemsPresenter ... />
</l:CyclicScrollViewer>
...
</ControlTemplate>
Я разместил пример приложения, использующего этот код здесь . Этот образец не имеет поддержки клавиатуры, но его можно просто добавить, переопределив метод OnKeyDown и выполнив соответствующие команды Line ... . Надеюсь, это поможет.