3

ピボット ビューがあり、6 つのピボット項目があります。各ピボット項目には、映画のリストが含まれています。各ムービーにはカバー画像があり、その横にタイトルとその他のメタデータがあります。これを希望どおりにスタイルするには、明らかにいくつかのグリッド/スタックパネルを使用する必要がありました。また、各アイテムのコンテキストメニューがあります。リストボックスの上に、データのロード中に表示するパフォーマンス プログレス バーがあります (すべて Web API から取得します)。私の問題は、リストの 1 つに他のリストよりも多くの映画が含まれていることです (約 100)。このリストをロードすると、アプリは約 150-160 MB のメモリを使用し、90 MB の制限を超えます。すべての画像とコンテンツがすぐに読み込まれるように見えます (これがこの問題の原因だと思います)。

私が欲しいのはこれです:

最初にタイトルとメタデータをロードしてから、ユーザーが現在リスト内にいる場所にのみ画像をロードして、ユーザーが下にスクロールする前にリストの下の方にある画像がロードされないようにします。

deferredloadlist、lazylist、および通常のリストボックスを使用してみましたが、仮想化を標準に設定してリサイクルしようとしましたが、結果はありませんでした。ただし、これらすべてが実際に何をしているのかはわかりません。これを修正する方法を知っている人はいますか?前もって感謝します。

PS。リストボックスの xaml コードはやや不格好なので、この投稿には含めないことにしました。あなたが本当に助けるためにそれを見る必要があるかどうか私に知らせてください.

更新: 仮想化リストボックスを使用してメモリ使用量を減らすことができましたが、それでも約 100 mb です。bitmapImage.ImageSource =null; の設定をどこかで読みました。画像の使用が終了すると、メモリから消去されます。リストボックスにあるときに各画像に対してこれを行うにはどうすればよいですか?

4

2 に答える 2

4

ListBox自体は多くのメモリを使用しません。行うのはListBoxItemsのコンテンツです。仮想化パネルは、表示されている(さらにいくつかの)ListBoxItemのみを作成し、画面外のListBoxItemを破棄します。したがって、ListBox.ItemsPanelを設定しないなどして、ListBoxが仮想化パネルを使用していることを確認してください。

仮想化の場合、パネルのサイズを制限する必要があります。そうしないと、すべてのListBoxItemが作成されます。一般に、これは、リストボックスをグリッドに配置するか、幅/高さを設定することにより、リストボックスに制限されたサイズを与えることによって行われます。ただし、代わりにリストボックスを制約のないコンテナ(ScrollViewer、StackPanelなど)内に配置すると、リストボックスのサイズは無制限になり、ItemsPanelは必要なだけ大きくなり、すべてのListBoxItemが作成されます。 '画面から遠く離れています。

于 2012-07-27T13:25:40.513 に答える
1

遅延画像ダウンロードを試しましたか?:

public class ItemViewModel 
{
   private BitmapImage _image;
   public BitmapImage Image 
   {
      get{

      if(_image == null)
      {
         _image = new BitmapImage();
          StartDownloadImageAsync();
      }
       return _image;
      }
   }
}

画像をダウンロードした後、_image に設定して RaisePropertyChanged("Image"); を呼び出します。したがって、仮想化されたリストボックスでは、表示されているアイテムの画像のみをダウンロードします。

そうした場合は、リストのページネーションを試みることができます。

于 2012-07-27T12:12:05.520 に答える