Scroll-Problem in der virtualisierten TreeView

9

Heute habe ich beschlossen, endlich das virtualisierte TreeView auszuprobieren. Um dies zu tun, ist eine Bindung erforderlich. Also entschied ich mich, 2 Dinge zu testen - HierarchicalDataTemplate basierend auf Typen + Virtualisierung.

Ich habe eine Basisklasse für einige Daten erstellt. Erstellt 2 abgeleitete Klassen aus der Basisklasse. Hat 2 HierarchicalDataTemplate erstellt (1 für jede abgeleitete Klasse), um unterschiedliche Formatierungen von Knoten zu erhalten. Und läuft Population von 10k Knoten von 2 Arten.

Klassen:

%Vor%

Generierung von 10k Knoten der 1. Ebene mit einigen Kindern, Bindung:

%Vor%

XAML mit HierarchicalDataTemplates:

%Vor%

Alles funktioniert gut:

  • treeview wird virtualisiert (leicht erkennbar durch Speicherbedarf + Ladezeiten)
  • Knoten, die von Typen abgeleitet sind, sind korrekt formatiert

Beim Scrollen zu Header # 1000 und dem Erweitern würde die Scroll-Position jedoch zu einer anderen Stelle springen, wodurch der erweiterte Knoten und seine untergeordneten Elemente NICHT sichtbar werden.

Was habe ich falsch gemacht? Gibt es eine Möglichkeit, das zu beheben?

Update: Durch das Entfernen der Virtualisierung wird auch der Bildlauffehler entfernt.

    
user2274578 12.04.2013, 13:40
quelle

5 Antworten

1

Nachdem viele Probleme mit der Baumvirtualisierung in C # WPF aufgetreten sind (einschließlich des Hauptproblems, dass nur die allererste Ebene virtualisiert wird), konnte ich keine richtige Lösung finden. Microsoft hat einen Fehlerbericht akzeptiert und geantwortet, dass das Scrollen in einer der zukünftigen Versionen behoben wird.

Was die endgültige Lösung für mich persönlich betrifft - ich habe zu einer eigenen Implementierung von ListTreeView gewechselt, d. h. mit List und Simulationsbaum. Dies löste alle Probleme mit der Virtualisierung und mit Scrollverhalten. Das einzige Problem war - Entfernen vieler Elemente nach dem Zusammenfalten des Baumknotens. Ich musste eine Überprüfung durchführen, wenn es einfacher / schneller ist, einfach eine neue Liste neu zu erstellen, anstatt die Elemente 1 zu 1 zu löschen.

    
user2274578 18.03.2014 15:51
quelle
0

Versuchen Sie, das Recycling zu deaktivieren (nicht aktiviert)

%Vor%

Der Optimierungsartikel bezieht sich auf das Einschalten

Vorgehensweise: Verbessern der Leistung einer TreeView

    
paparazzo 12.04.2013 14:22
quelle
0

Ich würde mich freuen, wenn jemand1 das einfach in seiner Umgebung testen und das Problem bestätigen könnte. Auch ein bisschen herumzuspielen fand ein anderes merkwürdiges Verhalten:

  • hat den Modus in Standart geändert
  • implementierte zweifache Bindestrichbindung (nicht sicher, ob dies überhaupt erforderlich ist)

Als nächstes führe das Programm aus:

  • Erweitere den Header mit einer großen Zahl, wie 1000 - Scroller springt zu einem anderen Ort

Führe das Programm erneut aus (für die Reinheit des Experiments)

  • Erweitern Sie einen der ersten Header wie # 2.
  • Erweitern Sie die Kopfzeile mit einer großen Nummer, zB 1000 - Scroller bleibt an der richtigen Stelle ...

Das Erweitern eines der ersten Knoten scheint ein Workaround zu sein.

    
user2274578 16.04.2013 13:20
quelle
0

Ich habe eine Lösung auf MSDN gefunden. Anscheinend hat es etwas mit der Standard-TreeView-Vorlage zu tun. Das folgende Problem behebt das Flimmern der Bildlaufleiste und verhindert, dass zufällige Knoten beim schnellen Blättern expandieren.

%Vor%

Ich habe schnell geblättert und schien kein Problem mehr zu bemerken. Das Tolle daran ist, dass Sie Ihre Virtualisierung nicht einmal abschaffen müssen.

    
James M 21.04.2016 02:40
quelle
0

Gemäß Ссылка ( ScrollUnit Enumeration), gibt es zwei mögliche Werte. Der Standard scheint "Pixel" zu sein, was die Scroll-Probleme verursacht. Der Wechsel zu 'Item', wie unten gezeigt, behebt das Problem:

VirtualizingStackPanel.ScrollUnit="Element"

    
WpfJoe 11.12.2016 10:37
quelle

Tags und Links