1

私がやろうとしているのは、Windows8MetroアプリケーションのListViewにプリロードされた画像を動的に入力することです。

各アイテム(URI)について、次のようなコード(C ++)を使用して単純に実行しています。

Windows::UI::Xaml::Media::Imaging::BitmapImage^ bitmapSrc =
    ref new Windows::UI::Xaml::Media::Imaging::BitmapImage();

bitmapSrc->CreateOptions = Windows::UI::Xaml::Media::Imaging::BitmapCreateOptions::IgnoreImageCache;

bitmapSrc->UriSource = uri;

img->Source = bitmapSrc;

LoadListView->Items->Append(img);

しかし、URIで記述されたソース画像を(アプリで)削除し、同じ名前で新しいファイルを作成してリストに再読み込みしようとすると失敗し、表示される画像は古いもの(削除済み)です。ここでいくつかのキャッシュが機能すると思います。CreateOptionsのIgnoreImageCache値によるキャッシュを回避しようとしましたが、機能しませんでした。

Windows 8アプリでListViewにバインドされる可能性のあるBitmapSource(画像)のキャッシュを無効にする方法の手がかりはありますか?

SilverlightとWPFに触発されたいくつかの方向を試しましたが、残念ながらどれもうまくいきませんでした。

4

1 に答える 1

0

コメントに励まされて、私は自分で見つけた答えを出しました。

より広いコンテキスト(およびC#の観点)については、ここで説明しています: http ://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/171dfe66-78b5-4340-bd78-244337f31287/

間もなく、ここでの参照カウントに問題があると思います。WinRTは、Uriが有効であり、オブジェクトインスタンスに割り当てられている限り、画像をBitmapImage ^にロード(キャッシュ)し続けます。私の例では、それがリストに追加されます。

リストからリリースする前にBitmapImage^からURIをクリーンアップすると、私の場合の問題が解決しました。

問題の例によると、以下のコードは問題を解決します(リストの削除が実行される部分に含まれています):

auto item = (Image^)LoadListView->Items->GetAt(selected);
auto src = (Windows::UI::Xaml::Media::Imaging::BitmapImage^)item->Source;

src->UriSource = nullptr; //this line is critical

LoadListView->Items->RemoveAt(selected);
于 2012-12-11T10:40:38.163 に答える