Как отключить кеш в ListView в Windows 8 на основе Xaml?

Я пытаюсь динамически заполнять 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, но, к сожалению, ни одно из них не сработало.

1

Решение

Воодушевленный комментариями, я поставил ответ, который нашел сам.

Более широкий контекст (а также перспектива 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);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]