Я пытаюсь динамически заполнять ListView в приложении Windows 8 Metro предварительно загруженными изображениями.
для каждого элемента (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, и я создаю новый файл с тем же именем и пытаюсь перезагрузить его в список, то мне не удается, и показанное изображение является старым (удаленным). Я предполагаю, что некоторые кеш работает здесь. Я пытался избежать кеширования по значению IgnoreImageCache в CreateOptions, но это не сработало.
Есть какие-нибудь подсказки, как отключить кэширование BitmapSource (Image), потенциально связанного с ListView в приложении Windows 8?
Я пробовал несколько направлений, вдохновленных Silverlight и WPF, но, к сожалению, ни одно из них не сработало.
Воодушевленный комментариями, я поставил ответ, который нашел сам.
Более широкий контекст (а также перспектива C #) объясняется здесь:
http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/171dfe66-78b5-4340-bd78-244337f31287/
Вскоре я считаю, что это проблема с подсчетом ссылок здесь.
WinRT сохраняет загруженное (кэшированное) изображение в BitmapImage ^ до тех пор, пока Uri действителен и назначен экземпляру объекта, который в моем примере добавлен в список.
Очистка Uri от BitmapImage ^ перед выпуском его из списка решила проблему в моем случае.
В соответствии с рассматриваемым примером, код ниже решает проблему (входит в часть, где выполняется удаление списка):
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);
Других решений пока нет …