Я создаю собственный подкласс 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?





Вы пробовали элемент управления ItemsView?
<ItemsView x:Name = "ItemsViewControl" ItemsSource = "{x:Bind Items}" />
затем в коде программной части:
int targetIndex = 123;
this.ItemsViewControl.StartBringItemIntoView(targetIndex, new BringIntoViewOptions());
Похоже, мне придется провести рефакторинг из-за нескольких отличий от ItemsControl . Это специальная сетка данных и порт из WPF, поэтому я во многом полагаюсь на то, как работает ItemsControl. Но мне нравится, что здесь есть возможность анимированной прокрутки, чего нет даже в ListView. Потенциально это может быть даже лучшим обходным решением, чем ListView. Спасибо за совет.
Итак, у ItemsView было много вещей, которые мне тоже не нужны, но это привело меня к ItemsRepeater и позволило мне начать с довольно общего контроля и получить то, что я хотел. Хотя это по-прежнему представляло собой неприличное количество проб и ошибок, включая создание подклассов ScrollView для создания липких столбцов. Длинная история. В этой структуре СЛИШКОМ слишком много элементов управления, которые делают почти одно и то же, но не совсем, и тем не менее ни один из них на самом деле не объединяет их все. Но теперь это работает! Большое спасибо за то, что направили меня в правильном направлении.
Ооо, это может сработать. Позвольте мне попробовать и вернуться назад.