0

ObservableCollection<Photo>から取得したオブジェクトのリストでWrapPanelを入力するWindows Phone 7用のアプリケーションを開発しています。ユーザーがPanelTemplateとしてWrapPanelを使用してコンテンツをスクロールするときに、タイプImageのListboxItemをロードすることは可能ですか?

<ListBox ItemsSource="{Binding Photo}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Image Source="{Binding File}" /> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <toolkit:WrapPanel ItemHeight="150" ItemWidth="150" /> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
</ListBox> 

(それがすべてのイメージのロードだ手段で)動作するようになっていますどのように働いているが、私はWrapPanel : Panel以来、いくつかのパフォーマンス上の問題を抱えています。したがって、ユーザーが見ることができないものであっても、ListBoxのすべてのImageオブジェクトをロードするデータは仮想化されません。

このアプローチは、ObservableCollection<Photo>.Count <= 30ではなく、Collectionが大きくなるにつれて遅くなる場合があります。

ユーザーは最大1000個の画像を持つことができるので、単純にこのようには動作しません。サムネイルを束縛してImageオブジェクトを表示していますが。

私はDavid Anson's LowProfileImageLoaderを使用して、UIスレッドから画像を作成しようとしました。また、ユーザーがListBoxをスクロールするときにイメージをバインドする。しかし、画像がIsolatedStorageから読み込まれているので、UriSourceが予想され、実際にBitmapImageImage.Sourceにバインドしているので、動作しません。

public class Photo : INotifyPropertyChanged, INotifyPropertyChanging 
{ 
    ... 
    ... 

    public BitmapImage File 
    { 
     get 
     { 
      // Thumbnail 
      string filePath = Path.Combine("Images", FileName); 

      byte[] data; 

      using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication()) 
      { 
       using (IsolatedStorageFileStream isfs = isf.OpenFile(filePath, FileMode.Open, FileAccess.Read)) 
       { 
        data = new byte[isfs.Length]; 

        isfs.Read(data, 0, data.Length); 
        isfs.Close(); 
       } 
      } 

      MemoryStream ms = new MemoryStream(data); 
      BitmapImage bi = new BitmapImage(); 

      bi.SetSource(ms); 

      return bi; 
     } 
    } 
} 

ユーザーがそれを見ていると誰もがコンテンツ(写真)負荷を作るこのタスクで私を助けることができますか? VirtualizingWrapPanelWrapPanel : VirtualizingPanelなどはありますか?

ありがとうございました。コードスニペットが必要な場合は、お気軽にお問い合わせください。

+0

[WP7 Virtualizing WrapPanel]の可能な複製(http:// stackoverflow。com/questions/5046810/wp7-virtualizing-wrappanel) – nemesv

+0

商用の[ラップパネルの仮想化](http://www.binarymission.co.uk/Products/WPF_SL/virtualizingwrappanel_wpf_sl.htm)もあります。 – nemesv

+0

@nemesv私は見ましたこの質問は答えは私の問題を解決していないので、私はVirtualizedWrapPanelだけでなく、実際にリストを滑らかにするための回避策を求めています。私はまた、できるだけ明確に私の質問をしようとするいくつかのコードを抜粋しました – Matheus

答えて

0

ユーザーがスクロールするときに画像をストレージからメモリにロードすると、特にユーザーがスクロールしたり、もっと多くの要素をすばやく表示しようとするときに、UIがびびります。 しかし、メモリ内のすべてのイメージを持ち、スクロール時にイメージをリストボックスにバインドする場合は、VirtualizingStackPanelを使用できます。ラップパネルは、正しく表示するには画像のサイズを知る必要があります。画像のサイズがわかっていて、すべて同じであれば、回避策が可能です。

VirtualizingStackPanelをカスタマイズして、イメージをラッパネルのように行に配置するなど、好きな方法で配置することができます。

希望に役立ちます。

ただし、 1000枚の重いイメージがあるときに問題が解決するかどうかはわかりません。しかし、あなたがそうしていないなら、試してみる価値があります。

EDIT:This articleが参考になる場合があります。

+1

行ごとに3項目を表示するためにVirtualizingStackPanelをカスタマイズする方法を知っていますか?私はアイテムの幅が常に150pxであることを知っているので?コードスニペットを教えていただけますか?私は今仕事中で、家に帰るとすぐに自分のカスタマイズをしようとします。どうもありがとう。 – Matheus

0

仮想化リストボックスからラップパネルを作成してみてください。 Hereはリンクする方法です。それはかなり良いですが、それは1つの問題があります...それはアイテムの代わりに全体の行に傾きの効果があります...私は現在その問題を調査しています。

+0

ああ、私は円滑に方向を変える方法を理解できませんでした... –

関連する問題