我有一个ItemsControl,您可以使用向上/向下翻页按钮按预期滚动。我用ListBox切换它,以在选择项目时应用(通过触发器)新的 DataTemplate 。
一切正常,直到使用 pageup 或 pagedown 按钮。它不是滚动一页,而是滚动到结尾或开头。
我之前的尝试:
- DataTemplate 更改时不更改项目高度
- 完全删除 IsSelected=True 触发器
- 所有 SelectionMode 值
我错过了一些微不足道的事情吗?
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);
}
向下翻页
RaiseKeyDownUpEventsOnEntitiesBox(Key.Next);
向上翻页
RaiseKeyDownUpEventsOnEntitiesBox(Key.Prior);
确实,我错过了一些微不足道的事情。我忘了删除 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);
一开始,item可能评估为 null,但这不会产生问题。添加了一些项目之后,幸运的是在我们需要滚动之前,成功返回了一个容器。请注意,这里的索引并不重要,我们只需要ScrollViewer中的IInputElement 。