Прокрутка списка со страницей вверх/вниз

У меня был ItemsControl, в котором можно было использовать кнопки вверх/вниз страницы для ожидаемой прокрутки. Я переключил его на ListBox, чтобы применить (через триггеры) новый DataTemplate при выборе элемента.

Все работает нормально, пока не используются кнопки pageup или pagedown. Вместо прокрутки одной страницы он прокручивается до конца или начала.

Мои предыдущие попытки:

  • Не изменять высоту элемента при изменении DataTemplate
  • Полностью удален триггер IsSelected=True.
  • Все значения SelectionMode

Я пропустил что-то тривиальное?


person orcun    schedule 10.04.2009    source источник
comment
Вставьте какой-нибудь код, иначе мы гадаем.   -  person Anand Shah    schedule 10.04.2009


Ответы (2)


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);
person user192955    schedule 12.03.2010
comment
Если Keyboard.PrimaryDevice.ActiveSource имеет значение null, используйте это: new HwndSource(0, 0, 0, 0, 0, string.Empty, IntPtr.Zero) - person Kip Morgan; 06.07.2016

Действительно, я пропустил что-то тривиальное. Я забыл удалить ScrollViewer вне ItemsControl. Я думаю, это создает путаницу, так как ListBox имеет свой собственный ScrollViewer.

Это вызвало еще один вопрос. Предыдущий ScrollViewer автоматически прокручивался вниз от кода позади. Теперь, когда я не могу получить доступ к ScrollViewer ListBox, я не могу вызвать его метод 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, однако это не создает проблемы. После добавления нескольких элементов, к счастью, до того, как нам нужно прокрутить, контейнер успешно возвращается. Обратите внимание, что индекс здесь не важен, все, что нам нужно, это IInputElement внутри ScrollViewer.

person orcun    schedule 10.04.2009