使用向上/向下翻页滚动列表框

时间:2009-04-10 12:00:56

标签: wpf listbox scroll

我有一个 ItemsControl ,您可以使用页面向上/向下按钮进行预期滚动。我用 ListBox 切换它,以便在选择项目时应用(通过触发器)新的DataTemplate。

一切正常,直到使用pageup或pagedown按钮。它不是滚动一页,而是滚动到结束或开始。

我以前的尝试:

  • DataTemplate更改时不更改项目高度
  • 已删除IsSelected =完全触发
  • 所有SelectionMode值

我是否想念一些微不足道的事情?

2 个答案:

答案 0 :(得分:1)

private void RaiseKeyDownUpEventsOnEntitiesBox(Key key)
{
    KeyEventArgs keyEventArgs = new KeyEventArgs(
        InputManager.Current.PrimaryKeyboardDevice,   
        Keyboard.PrimaryDevice.ActiveSource, 
        System.Environment.ProcessorCount, key);
    keyEventArgs.RoutedEvent = UIElement.KeyDownEvent; 
    entitiesBox.RaiseEvent(keyEventArgs);
    keyEventArgs.RoutedEvent = UIElement.KeyUpEvent; 
    entitiesBox.RaiseEvent(keyEventArgs);
}

Page Down

RaiseKeyDownUpEventsOnEntitiesBox(Key.Next);

Page Up

RaiseKeyDownUpEventsOnEntitiesBox(Key.Prior);

答案 1 :(得分:0)

确实,我错过了一些微不足道的事情。我忘了在ItemsControl之外删除ScrollViewer。我猜,这会造成混乱,因为ListBox有自己的ScrollViewer。

这提出了另一个问题。以前的ScrollViewer自动从后面的代码向下滚动。现在,我无法访问ListBox的ScrollViewer,我无法调用其 LineDown 方法。这是我的解决方法:

// Responses is the ItemsSource
Responses.Add(e); 
// xResponses is the ListBox
var item = xResponses.ItemContainerGenerator.ContainerFromIndex(0);
ScrollBar.LineDownCommand.Execute(null, item as IInputElement);

一开始,可能会评估为null,但这不会产生问题。在添加几个项目之后,幸运的是在我们需要滚动之前,成功返回一个容器。请注意,索引在这里并不重要,我们需要的只是ScrollViewer中的 IInputElement