I have a ItemsControl
which displays its items in a ScrollViewer
, and does virtualisation. I am trying to scroll that ScrollViewer
to an (offscreen, hence virtualised) item it contains. However, since the item is virtualised, it doesn't really exist on the screen and has no position (IIUC).
I have tried BringIntoView
on the child element, but it doesn't scroll into view. I have also tried manually doing it with TransformToAncestor
, TransformBounds
and ScrollToVerticalOffset
, but TransformToAncestor
never returns (I guess also because of the virtualisation, because it has no position, but I have no proof of that) and code after it never executes.
Is it possible to scroll to an item with a virtualising ItemsControl
? If so, how?
Poking around in the .NET source code leads me to recommend you the use of a ListBox
and its ScrollIntoView
method. The implementation of this method relies on a few internal
methods like VirtualizingPanel.BringIndexIntoView
which forces the creation of the item at that index and scrolls to it. The fact that many of those mechanism are internal means that if you try to do this on your own you're gonna have a bad time.
(To make the selection this brings with it invisible you can retemplate the ListBoxItems
)