2009-02-26 18 views
1

Ich entwickle eine Silverlight-Anwendung, die Elemente in einem Listbox-Steuerelement anzeigt, und ich bin in ein kleines Leistungsproblem geraten.Silverlight Listbox Leistungsproblem mit ListBox

Jedes Element in der Listbox ist ein benutzerdefiniertes Stackpanel mit etwas formatiertem Text und so weiter.

Wenn ich eine Liste von 500 oder weniger Elementen habe, funktioniert das Listenfeld gut, aber das Laden von mehr als diesem verursacht Probleme. Bei 1000 Artikeln verbraucht Silverlight 10% CPU, selbst wenn ich nichts tue, bei 3000 Artikeln verbraucht die CPU konstant 32-36%.

Dies ist auf einem Dual-Core-Maschine, auf einer älteren Maschine, die ich getestet auf der CPU-Nutzung geht weit nach oben.

Das wirkt sich auch auf die Framerate aus, ich bekomme 6fps mit einer 3000 Item Listbox, die die Anwendung träge macht.

Weiß jemand, was das verursachen könnte? Mein erster Gedanke war, dass Silverlight versucht, alle Elemente zu rendern, obwohl die Elemente außerhalb des Bildschirms sind ... das scheint konsistent zu sein, als ob ich Elemente mit ihrer Sichtbarkeit einfüge.Kollaps, der zusätzliche CPU-Overhead ist nicht vorhanden.

PS: Ich laufe in windowless = "true", da ich etwas HTML ontop meiner silverlight Form anzeigen muss.

Antwort

3

Sie sollten das DataGrid in Silverlight 2 verwenden, da es die UI-Virtualisierung unterstützt. Es wurde mit Millionen von Elementen getestet und erstellt nur genügend Visuals, die zur Anzeige benötigt werden.

+0

Danke Ich werde in die Verwendung des Datagrids schauen und sehen, was passiert .. – JSmyth

1

Ihre Schätzung ist grundsätzlich richtig. Obwohl Silverlight nicht versucht alle 3000 Elemente in der ListBox zu rendern, muss es noch 3000 ListBoxItem-Objekte erstellen, die während der Layout-Zeit usw. gemessen und angeordnet werden, nur damit sie zum Rendern abgeschnitten werden. Layout ist viel schneller, wenn die Elemente kollabiert sind (da in diesem Szenario grundsätzlich nichts für Layout zu tun ist).

WPF hat VirtualizingStackPanel, das dieses Problem lösen würde, leider hat Silverlight dieses Element nicht.

1

+1 für die Verwendung der Silverlight DataGrid in diesem Szenario, stellen Sie sicher, dass Sie die latest version installed als Standard Silverlight SDK-Version hat ein paar Bugs.

Eine weitere Option ist die Verwendung des kostenlosen Silverlight DataGrid Control available here. Eines seiner Features ist auch ein virtueller StackPanel-Zeilencontainer, was bedeutet, dass das Grid eine unbegrenzte Anzahl von Zeilen verarbeiten kann.

Vergleichen Sie die Leistung der einzelnen und sehen, welche am besten in Ihrer Situation funktioniert.

0

Nur eine Beobachtung - mit Silverlight 4 scheint das kein Problem mehr zu sein. Das Hinzufügen von 100K-Elementen zu einer Datentemplate-Listbox erfolgt augenblicklich, und es ist auch in Ordnung.

0

Das hat mir geholfen: Silverlight DeferredLoadListBox. Es wurde von David Anson, einem Microsoft-Mitarbeiter geschrieben.

Die DeferredLoadListBox stammt von ListBox, hat aber viel bessere Leistung.

Verwandte Themen