Scrollen zu einem Element eines virtualisierenden ItemsControls

7

Ich habe ein ItemsControl , das seine Elemente in ScrollViewer anzeigt und virtualisiert. Ich versuche, dieses ScrollViewer zu einem (offscreen, also virtualisierten) Element zu scrollen, das es enthält. Da das Element jedoch virtualisiert ist, existiert es nicht wirklich auf dem Bildschirm und hat keine Position (IIUC).

Ich habe BringIntoView für das untergeordnete Element ausprobiert, aber es wird nicht in die Ansicht gerollt. Ich habe auch versucht, es manuell mit TransformToAncestor , TransformBounds und ScrollToVerticalOffset , aber TransformToAncestor kehrt nie zurück (ich denke auch wegen der Virtualisierung, weil es keine Position hat, aber ich habe keinen Beweis dafür) und Code, nachdem es nie ausgeführt wird.

Ist es möglich, zu einem Objekt mit einem virtualisierten ItemsControl zu blättern? Wenn ja, wie?

    
Seth Carnegie 25.08.2012, 19:40
quelle

3 Antworten

9

Wenn ich im .NET-Quellcode herumstokele, empfehle ich Ihnen die Verwendung von ListBox und dessen ScrollIntoView Methode. Die Implementierung dieser Methode beruht auf einigen internal -Methoden wie VirtualizingPanel.BringIndexIntoView , die die Erstellung des Elements in diesem Index erzwingen und zu diesem scrollen. Die Tatsache, dass viele dieser Mechanismen intern sind, bedeutet, dass, wenn Sie versuchen, dies auf eigene Faust zu tun Sie eine schlimme Zeit haben werden.

(Um die Auswahl unsichtbar zu machen, können Sie die ListBoxItems erneut eingeben)

    
H.B. 25.08.2012, 20:59
quelle
11

Ich habe versucht, ein ItemsControl mit einem VirtualizingStackPanel zu bekommen, um eine Zeit lang zu einem Element zu blättern, und habe immer wieder die Antwort "Benutze eine ListBox" gefunden. Ich wollte nicht, also habe ich einen Weg gefunden, es zu tun. Zuerst müssen Sie eine Kontrollschablone für Ihr ItemsControl einrichten, die einen ScrollViewer enthält (den Sie wahrscheinlich bereits haben, wenn Sie ein Element-Steuerelement verwenden). Meine Basisvorlage sieht folgendermaßen aus (in einem praktischen Stil für das ItemsControl enthalten)

%Vor%

Also habe ich im Grunde einen Rahmen mit einem Scroll-Viewer, der meinen Inhalt enthält.
Mein ItemsControl ist definiert mit:

%Vor%

Ok, jetzt zum Spaß. Ich habe eine Erweiterungsmethode erstellt, die an jedes ItemsControl angehängt wird, um es zum gewünschten Element zu scrollen:

%Vor%

Wenn Sie also die Erweiterungsmethode verwenden, verwenden Sie sie genauso wie die Begleitmethode von ListBox:

%Vor%

Funktioniert gut!

Beachten Sie, dass Sie auch sv.ScrollToEnd () und die anderen üblichen Scrollmethoden aufrufen können, um Ihre Elemente zu umgehen.

    
Aaron Cook 28.11.2012 04:11
quelle
0

Ich weiß, dass ich ziemlich spät auf der Party bin, aber hoffentlich hilft das einem anderen, der nach der Lösung sucht ...

%Vor%

... und mein XAML ist so eingerichtet ...

%Vor%     
Chris D 17.03.2015 18:53
quelle