2016-03-23 9 views
2

ピクチャライブラリのカスタムフォルダからアプリケーションのListViewに画像を表示できます。しかし、そのカスタムフォルダに3つ以上のイメージがある場合、メモリ不足例外が発生するか、アプリケーションがクラッシュし、Visual Studioはアプリケーションがクラッシュしたことを認識しません。私の質問は、どうやってこの仕事をすることができるのですか?ここでListViewに画像を埋め込む際にメモリ不足が発生する(Windows Phone 8.1)

は私のコードです... xaml.csファイルで

:ここ

List<StorageFile> FileList = (await temp.GetFilesAsync()).ToList(); 

List<ImageItem> ImageList = new List<ImageItem>(); 
for (int i = 0; i < FileList.Count; i++) 
    { 
     using (IRandomAccessStream FileStream = await FileList[i].OpenAsync(FileAccessMode.Read)) 
      { 
       using(StorageItemThumbnail thumbnail = await file.GetThumbnailAsync(ThumbnailMode.PicturesView)) 
        { 
         if (thumbnail != null && thumbnail.Type == ThumbnailType.Image) 
         { 
          BitmapImage bitmap = new BitmapImage(); 
          await bitmap.SetSourceAsync(FileStream); 
          ImageList.Add(new ImageItem() { ImageData = bitmap }); 
         } 
        } 
      } 
    } 
    this.PhotoListView.DataContext = ImageList; 

は私ヘルパークラスである:ここでは

public class ImageItem 
    { 
     public BitmapImage ImageData { get; set; } 
    } 

は私ですxaml ListViewコード:

<ListView Grid.Column="1" 
      Grid.Row="0" 
      x:Name="PhotoListView" 
      Grid.RowSpan="1" 
      ItemsSource="{Binding}"> 

      <ListView.ItemTemplate> 
       <DataTemplate> 
        <Image Source="{Binding ImageData}" 
         Margin="10"/> 
       </DataTemplate> 
      </ListView.ItemTemplate> 

      <ListView.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel /> 
       </ItemsPanelTemplate> 
      </ListView.ItemsPanel> 
</ListView> 

答えて

3

あなたのコードの問題あなたはBitmapImageを使用するときにDecodePixelHeightDecodePixelWidthを指定していない、あなたは2通りの方法で問題を解決できるということです。 最初はDecodePixelHeightDecodePixelWidthを指定することで、第二は、このコードを使用してリストビューに画像のパスを渡す:

List<StorageFile> FileList = (await temp.GetFilesAsync()).ToList(); 

List<string> ImageList = new List<string>(); 

foreach(var file in FileList) 
{ 
    ImageList.Add(file.Path); 
} 

this.PhotoListView.DataContext = ImageList; 

Imageコントロールはあなたのためにすべてのものを行うことが可能であり、同様にメモリ管理の世話をします。

+1

ありがとうございます!これは私の問題を解決します。私は物事を複雑にするだけかもしれないと思うので、私は自分のコードを編集して、今は完全に動作します。 –

2

あなたの主な問題は、設定がItemsPanelTemplateStackpanelであると思います。これは仮想化を殺します。デフォルトの項目パネルをオーバーライドする理由はありません。

frenk91と同様に、DecodePixelHeightDecodePixelWidthをXAMLに追加すると便利です。

関連する問題