2016-10-25 11 views
0

Ich entwickle interne Dateimanager in meiner UWP App. Ich StorageFolder Inhalt in einem Gridview zeigt mit dem Aufruf dieser Methode:Async Binding Thumbnail Image in UWP

gridView.ItemsSource = await storageFolder.GetItemsAsync(); 

Auch ich habe ein Element Vorlage eine Datei/Ordner-Element in die Gridview zur Visualisierung verknüpft aussehen. Ich habe ein Bildobjekt in dieser Vorlage. Ich möchte das Miniaturbild von StorageFolder an die Eigenschaft Source dieses Bildobjekts binden. GetThumbnailAsync() ist jedoch eine asynchrone Methode, keine Eigenschaft. Wie kann ich das machen?

+0

Werfen Sie einen Blick auf [Stephen Cleary's Blogpost] (https://msdn.microsoft.com/en-us/magazine/dn605875.aspx). – Romasz

+0

Danke @Romasz, aber es sucht nach MVVM-Anwendungen auf WPF, Asp.Net und Windows 8/8.1 Laufzeit. Einige Bibliotheken fehlen in Universal App Runtime. –

+0

Das Wichtigste im Blog ist, wie man mit asynchronen Methoden und Eigenschaften mit Aufgabenmuster umgehen kann. Darauf aufbauend denke ich, dass Sie Thumbnails mit Eigenschaften arbeiten können sollten. Welche Bibliotheken fehlen dir? – Romasz

Antwort

0

Ich habe auch eine Artikelvorlage zum Visualisieren eines Datei-/Ordner-Elementes, das mit dem GridView verknüpft ist. Ich habe ein Bildobjekt in dieser Vorlage. Ich möchte das Miniaturbild von StorageFolder an die Source-Eigenschaft dieses Image-Objekts binden.

Ich denke, Sie können zuerst die Miniaturansicht dann in Bild konvertieren, so kann es die Quelle von Image Kontrolle sein. Ich denke, was Sie brauchen, ist wie folgt:

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <Grid.Resources> 
     <local:ThumbnailToImageConverter x:Key="cvt" /> 
    </Grid.Resources> 
    <GridView x:Name="gridView"> 
     <GridView.ItemTemplate> 
      <DataTemplate> 
       <StackPanel> 
        <Image Source="{Binding Thumbnail, Converter={StaticResource cvt}}" Stretch="None" /> 
        <TextBlock Text="{Binding Name}" Margin="0,5" /> 
       </StackPanel> 
      </DataTemplate> 
     </GridView.ItemTemplate> 
    </GridView> 
</Grid> 

-Code hinter und Klasse für die Bindung Modell:

private ObservableCollection<Model> Collection = new ObservableCollection<Model>(); 

protected override async void OnNavigatedTo(NavigationEventArgs e) 
{ 
    var files = await KnownFolders.PicturesLibrary.GetFilesAsync(); 
    foreach (var file in files) 
    { 
     var thumbnail = await file.GetThumbnailAsync(ThumbnailMode.PicturesView, 100); 
     Collection.Add(new Model { Name = file.Name, Thumbnail = thumbnail }); 
    } 
    gridView.ItemsSource = Collection; 
} 

public class Model 
{ 
    public StorageItemThumbnail Thumbnail { get; set; } 
    public string Name { get; set; } 
} 

Code of ThumbnailToImageConverter:

public class ThumbnailToImageConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     BitmapImage image = null; 

     if (value != null) 
     { 
      StorageItemThumbnail thumbnail = (StorageItemThumbnail)value; 
      image = new BitmapImage(); 
      image.SetSource(thumbnail); 
     } 
     return (image); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Da ich PicturesLibrary in meinem Code verwendet wird, Wir müssen die <uap:Capability Name="picturesLibrary" /> in der Manifestdatei aktivieren, wenn Sie diesen Code testen.