2009-12-17 6 views
16

Ich habe eine ListBox, die viele Zeilen von Vorlagen DB-Datensätze haben kann, einschließlich einer Image, gebunden an eine ObservableCollection<MyItem>. Manchmal könnte die Sammlung Tausende von Gegenständen enthalten.ListBox, VirtualizingStackPanel und Smooth Scrolling in WPF

Die Leistung ist großartig, aber das Scrollen ist das Standard-Jumpy-Verhalten. Ich möchte, dass es reibungslos scrollt, also habe ich ScrollViewer.CanContentScroll deaktiviert.

Jetzt habe ich glatte Scrolling, aber die Leistung ist schrecklich: die Daten werden in einem separaten Thread abgerufen, und der Thread endet schnell, aber es dauert 10-20 Sekunden für die Ergebnisse in der ListBox angezeigt werden. Ich nehme an, dass dies der Fall ist, weil das Deaktivieren von ScrollViewer.CanContentScroll das zugrundeliegende VirtualizingStackPanel zu einem normalen StackPanel ändert, und so lädt es die gesamte Sammlung, bevor die Ergebnisse angezeigt werden.

Also meine Frage ist das: Wie behalte ich das reibungslose Scrollen ohne das VirtualizingStackPanel Verhalten und die Leistung zu opfern?

+5

http://stackoverflow.com/questions/1977929/wpf-listbox-with-a-listbox-ui-virtualization-and-scrolling/9875475 Virtua lizingPanel.ScrollUnit = "Pixel" – Guillaume

+0

Sie können sowohl reibungsloses Scrollen als auch Virtualisierung verwenden, wenn Sie bereit sind, einen kleinen Hack zu verwenden. Für eine ähnliche Frage siehe [diese Antwort] (http://stackoverflow.com/questions/1977929/wpf-listbox-with-a-listbox-ui-virtualization-and-scrolling/9875475#9875475). –

Antwort

6

Wenn Sie CanContentScroll deaktivieren, haben Sie lose virtualization. Und die Antwort ist wirklich frustrierend: Vorerst gibt es keine Out-of-the-box ist Lösung :(

. PS: Dies ist nicht der erste Beitrag hier, this very question fragen

+0

Ich hatte davor Angst, musste aber fragen. Ich habe gesucht, bevor ich gefragt habe, aber diesen Post nicht gefunden. Ich könnte ein bisschen mehr graben, aber die Zeit ist begrenzt, so dass ich Smooth Scrolling für jetzt verlieren muss. –

3

Wenn Sie .NET 4.5 verwenden. (oder 4.0, wenn Sie bereit sind, ein bisschen zu hacken), dann ist es eine Antwort over here.

[Beachten Sie, dass @ Guilluame Kommentar war hier Art und Weise vor dieser Antwort, aber es war nicht besonders sichtbar, wenn nach Antworten Skimming.]