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?
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)
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:
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.
Tags und Links wpf c# itemscontrol virtualizingstackpanel