WinUI3 Listview прокручивается до «следующей части» при нажатии клавишиC#

Место общения программистов C#
Anonymous
WinUI3 Listview прокручивается до «следующей части» при нажатии клавиши

Сообщение Anonymous »

Просмотр списка WinUI3 с использованием собственной полосы прокрутки будет:
  • прокручиваться к следующему элементу на странице вниз.
  • прокручиваться к следующему элементу по стрелке вниз.
  • ничего не делать на пробеле.
Для содержимого, которое меньше высоты списка, большая часть (не все) из вышеперечисленного вполне приемлема.
Однако это просто не работает, когда контент выше, чем список.
Я хочу иметь дело с каждым элементом переменной высоты.
Я искал способы сделать это:
  • сделайте что-нибудь более значимое для страницы вниз (смогу решить, как только узнаю как решить остальные).
  • прокрутите «немного» вниз по стрелке вниз. (определение этого см. в стандартном поведении браузера. Загрузите длинную страницу, а затем один раз нажмите стрелку вниз, чтобы увидеть, как она «немного» прокрутится вниз)
  • прокрутите «сильно» вниз по пробелу. (для определения этого обратитесь к стандартному поведению браузера. Загрузите длинную страницу, а затем один раз нажмите пробел, чтобы увидеть, как она будет прокручиваться до «следующего видимого раздела»)
Пример
Предположим, представление списка (800 пикселей) содержит 5 элементов:
  • Элемент 1: 400 пикселей
  • Элемент 2: 300 пикселей
  • Элемент 3: 1200 пикселей
  • Элемент 4: 500 пикселей
  • Элемент 5: 500 пикселей
Предположим, пользователь нажимает клавишу 5 раз.



нажмите
текущее поведение
желаемое поведение




страница вниз 1
прокрутка на 400 пикселей вниз
прокрутка на 700 пикселей вниз


страница вниз 2
прокрутка на 300 пикселей вниз
прокрутка на 1200 пикселей вниз


страница вниз 3
прокрутка на 1200 пикселей вниз
прокрутка на 500 пикселей вниз


страница вниз 4
прокрутка на 500 пикселей вниз
прокрутка 200 пикселей вниз


страница вниз 5
прокрутка на 200 пикселей вниз
ничего не делать, уже внизу


стрелка вниз 1
прокрутка на 400 пикселей вниз
прокрутить на 50 пикселей вниз


стрелка вниз 2
прокрутить на 300 пикселей вниз
прокрутить на 50 пикселей вниз


стрелка вниз 3
прокрутить на 1200 пикселей вниз
прокрутить на 50 пикселей вниз


стрелка вниз 4
прокрутить на 500 пикселей вниз
прокрутить на 50 пикселей вниз


стрелка вниз 5
прокрутить 200 пикселей вниз
прокрутить на 50 пикселей вниз


пробел 1
ничего не делать
прокрутить на 750 пикселей вниз


пробел 2
ничего не делать
прокрутить на 750 пикселей вниз


пробел 3
ничего не делать
прокрутить на 600 пикселей вниз


пробел 4
ничего не делать
ничего не делать, уже на внизу


пробел 5
ничего не делать
ничего не делать, уже внизу



Моя проблема в том, что:
  • Я не вижу другого метода ListView, кроме ScrollIntoView для управления прокруткой.
  • По умолчанию поведение стрелки вниз и вниз по странице похоже на использование ScrollIntoView(CurrentItem + 1).
  • Я не могу найти методы, которые:

    Определяют текущую позицию прокрутки внутри текущего элемента.
  • Прокрутка до определенной позиции в текущем элементе.

Гипотетический пример кода, показывающий, чего я хочу достичь:

Код: Выделить всё

// Let's say there were 2 methods:
// - void ScrollIntoView(Object Item, double PosInItem)
// - (Object Item, double PosInItem) CurrentScrollViewPos()

public async void KeyboardAccelerator_DownArrow(KeyboardAccelerator sender, KeyboardAcceleratorInvokedEventArgs args)
{
var csvp = MyListView.CurrentScrollViewPos();
MyListView.ScrollIntoView(csvp.Left, csvp.Right + config.SmallLeap);
}

public async void KeyboardAccelerator_Space(KeyboardAccelerator sender, KeyboardAcceleratorInvokedEventArgs args)
{
var csvp = MyListView.CurrentScrollViewPos();
MyListView.ScrollIntoView(csvp.Left, csvp.Right + MyListView.ActualHeight - config.SmallLeap);
}
Я что-то упустил?
Или я на неправильном пути?
Я в первую очередь хочу использовать прокрутку списка вместо встраивания представления списка в средство просмотра прокрутки, например:
  • При выходе из приложения я хочу сохранить индекс объекта.
  • При запуске приложения найдите сохраненные индекс (если он существует) и возобновите работу с этого элемента (используя текущий метод `ScrollIntoView(Object)`.

Вернуться в «C#»