WinUI 3 — программная прокрутка до виртуализированного элемента в ItemsControl (не ListView)

Я создаю собственный подкласс ItemsControl с довольно типичным шаблоном:

<Style TargetType = "local:MyControl">
    <Setter Property = "ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <ItemsStackPanel Orientation = "Vertical" /> 
                <!-- or VirtualizingStackPanel; not really sure 
                     why there are two different seemingly identical 
                     virtualization panels -->
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property = "Template">
        <Setter.Value>
            <ControlTemplate TargetType = "local:MyControl">
                <ScrollViewer x:Name = "ScrollViewer"
                              VerticalScrollBarVisibility = "Auto"
                              HorizontalScrollBarVisibility = "Auto">
                    <ItemsPresenter />
                </ScrollViewer>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

где MyControl — подкласс ItemsControl.

Мне нужен способ программной прокрутки к элементу по содержимому или даже по индексу, который еще не может быть реализован на экране, где высота элементов не является одинаковой.

Для ListView я могу использовать ScrollIntoView, но я не хочу получать производные от ListView, поскольку это включает в себя множество функций, которые я хочу заменить/переопределить.

В WPF VirtualizingStackPanel был BringIndexIntoViewPublic, но сейчас он, кажется, отсутствует, и я не могу найти ничего эквивалентного в WinUI VirtualizingStackPanel или ItemsStackPanel.

В исходном коде WinUI ListView.ScrollIntoView, похоже, используется множество внутренних/родных функций внутри ItemsPresenter, к которым у меня нет доступа.

Есть ли способ сделать это без создания подклассов ListView?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы пробовали элемент управления ItemsView?

<ItemsView x:Name = "ItemsViewControl" ItemsSource = "{x:Bind Items}" />

затем в коде программной части:

int targetIndex = 123;
this.ItemsViewControl.StartBringItemIntoView(targetIndex, new BringIntoViewOptions());

Ооо, это может сработать. Позвольте мне попробовать и вернуться назад.

Emperor Eto 29.04.2024 17:19

Похоже, мне придется провести рефакторинг из-за нескольких отличий от ItemsControl . Это специальная сетка данных и порт из WPF, поэтому я во многом полагаюсь на то, как работает ItemsControl. Но мне нравится, что здесь есть возможность анимированной прокрутки, чего нет даже в ListView. Потенциально это может быть даже лучшим обходным решением, чем ListView. Спасибо за совет.

Emperor Eto 29.04.2024 17:31

Итак, у ItemsView было много вещей, которые мне тоже не нужны, но это привело меня к ItemsRepeater и позволило мне начать с довольно общего контроля и получить то, что я хотел. Хотя это по-прежнему представляло собой неприличное количество проб и ошибок, включая создание подклассов ScrollView для создания липких столбцов. Длинная история. В этой структуре СЛИШКОМ слишком много элементов управления, которые делают почти одно и то же, но не совсем, и тем не менее ни один из них на самом деле не объединяет их все. Но теперь это работает! Большое спасибо за то, что направили меня в правильном направлении.

Emperor Eto 30.04.2024 00:53

Другие вопросы по теме