Bilder laden und anzeigen als Liste

Manche Dinge sind so einfach, das man nicht darüber nachdenkt bis man sie braucht. In .NET wäre das auflisten aller Bilder ungefähr s zu erledigen.

Dim files As String() = Directory.GetFiles("c:\temp",".jpg")

Windows 8 und seine WinRT API können aber ungleich mehr und Strom sparen soll man dabei auch noch, weil klassische Festplatten durchaus Stromfresser sind.

Vorteil Nummer eins, man kann in den Query Optionen mehrere Dateiendungen und eine Sortierung mitgeben. Wenn eine Abweichende von Default angegeben wird, versucht WinRT den Indexer zu verwenden. Das kann man auch erzwingen per IndexerOption.UseIndexerWhenAvailable.

Die Verzeichnistiefe ist per Standard Deep und wird hier per Shallow auf eine Ebene reduziert.

 Dim ft = {".jpg", ".png"}
 Dim qo = New QueryOptions(CommonFileQuery.DefaultQuery, ft)
 qo.FolderDepth = FolderDepth.Shallow
Dim itemQuery = KnownFolders.PicturesLibrary.CreateFileQueryWithOptions(qo) Dim fi = New FileInformationFactory(itemQuery, ThumbnailMode.DocumentsView)
Dim FileListe = Await fi.GetFilesAsync()
Liste1.ItemsSource = FileListe

In der zweiten Hälfte des Beispiels wird nicht einfach per GetFilesAsync alles geholt, sondern eine Query abgesetzt. Wenn man die Folder haben will, kommt GetFolderquery zum Einsatz. Für Bilder inkl. Unterverzeichnisse nimmt man CreateItemQuery. Beim Binden an eine Liste zeigt letzterer Fall einfach Thumbnails der Subdirectorys an.

im XAML wird dann gebunden und per Converter in den passenden Typ (hier BitmapImage) umgewandelt

 <Image Source="{Binding Path=Thumbnail, Converter={StaticResource thumbnailConverter}}"             

Die Microsoft Windows 8 Entwickler haben an alles gedacht. Wenn die Liste lange ist wird so was natürlich sehr langsam. Dann kommt der virtualisierte Datei Vektor zum Einsatz. Das Listview Control verwendet intern ohnehin das VirtualizingStackPanel verwendet. In meinem Test war das untere VB.NET Beispiel ein vielfaches schneller.

Dim itemQuery = KnownFolders.PicturesLibrary.CreateFileQueryWithOptions(qo) 
Dim fi = New FileInformationFactory(itemQuery, ThumbnailMode.DocumentsView)
Dim FileListe = Await fi.GetFilesAsync()
Liste1.ItemsSource = fi.GetVirtualizedFilesVector

Zusätzlich kann man auch ein oder mehrere sortier Kriterien über SortEntry einfügen. Auch die Suche in den Metadaten von Dateien ist möglich (PropertyName)

Ich empfehle das Beispiel DataSourceAdapter aus dem WinRT SDK.

Kommentare sind geschlossen