BitmapImage DecodePixelWidth ungerades Verhalten

Bei der Anzeige einer großen Anzahl von Bildern traten einige Leistungsprobleme auf. Ich stellte fest, dass das Bild in voller Auflösung verwendet wurde, als ich wirklich nur ein Bild benötigte, das kleiner als 1/4 der Größe war. Also habe ich eine Linie zwischen BeginInit und EndInit eingefügt, um DecodePixelWidth auf 200 zu setzen, was der maximalen Breite entspricht, die ich in meinem Layout benötige. Meine Leistung war kein Problem mehr, aber einige der Bilder sind wirklich klein, definitiv nicht annähernd 200 Pixel breit. Die meisten Bilder schienen korrekt angezeigt zu werden, und es scheint keinen Reim oder Grund zu geben, der zu klein ist und der richtig funktioniert. Ich dachte, es könnte an Unterschieden in den Originalabmessungen der Bilder liegen, aber es gab kein Muster für die Ergebnisse. Ich habe versucht, die Breite auf 600 zu erhöhen, wodurch die fehlerhaften Bilder mit der korrekten Breite von 200 angezeigt wurden, aber die Leistung leidet dann.

An diesem Punkt bin ich mir nicht einmal sicher, wo ich anfangen soll, und wäre wirklich dankbar für einen Tritt in die richtige Richtung.

BEARBEITEN: Weitere Informationen zu den Bildern und wie ich sie verwende.

Die meisten Bilder haben eine Größe von 1000x1500, obwohl einige ungewöhnliche Abmessungen wie 1000x1513 haben. Alle Bilder sind JPEG. Derzeit befindet sich jedes Bild in einem benutzerdefinierten Steuerelement, das ich entworfen habe. Es ist nichts Besonderes, als einen Hintergrund mit etwas Text zu verwenden. Jedes Benutzersteuerelement wird dann in einer eigenen Zeile / Spalte in ein Raster eingefügt. Das Raster befindet sich in einem Scrollviewer, sodass der Benutzer durch die Liste scrollen kann. Dies ist vielleicht nicht der beste Weg, um das zu erreichen, wonach ich suche, aber es ist das, was ich mir schnell ausgedacht habe und es funktioniert größtenteils. Ich würde gerne zu einer anderen Anzeigemethode wechseln, wenn dies auf einfachere oder präzisere Weise die gewünschten Ergebnisse bringen würde.

Das beabsichtigte Ergebnis ist für eine App zum Durchsuchen von Filmen. Es wird eine scrollbare Liste von Filmen geben, die jeweils als eigene Kachel mit Titel, Filmplakat, Genreinfo, Bewertung und Beschreibung dargestellt werden. Diese Liste kann nach verschiedenen Elementen sortiert werden. Die Informationen zu den Filmen werden in einer SQL-Datenbank auf einem anderen Computer gespeichert. Die Bilder werden ursprünglich auf einem anderen Computer gespeichert, aber lokal kopiert, um die Leistung zu verbessern.

BEARBEITEN: Ich konnte das Problem lösen, indem ich DecodePixelWidth nicht verwendete und stattdessen eine Kopie des Bildes in der gewünschten Größe speicherte. Dies hat die Leistung verbessert. Die Empfehlung von Youngjae, DecodePixelWidth nicht zu verwenden, und seine Erwähnung, eine virtualisierte Liste zu verwenden, führten mich zu den folgenden Artikeln zum Erstellen eines Virtualized Wrap Panels, das alle anderen Leistungsprobleme lösen sollte. Der Artikel ist für Silverlight, aber nach meinem Verständnis ist Silverlight im Grunde eine verwässerte Version von wpf. Wenn es in Silverlight funktioniert, sollte es in wpf funktionieren. Es sollte nicht zu schwierig sein, es für meinen Gebrauch umzuwandeln.

Teil 1 - MeasureOverride

Teil 2 - ArrangeOverride

Teil 3 - Animation

Teil 4 - Virtualisierung

Antworten auf die Frage(1)

Ihre Antwort auf die Frage