В моем приложении я использую ниже описанный вспомогательный метод для привязки моего изолированного образа хранилища к управлению изображением. Я получил этот вспомогательный метод по ссылке «Binding Image stored in the Isolated Storage to Image Control in Windows Phone»Приложение сбой при попытке привязки изолированного образа хранилища
public class IsoStoreImageSource : DependencyObject
{
public static void SetIsoStoreFileName(UIElement element, string value)
{
element.SetValue(IsoStoreFileNameProperty, value);
}
public static string GetIsoStoreFileName(UIElement element)
{
return (string)element.GetValue(IsoStoreFileNameProperty);
}
// Using a DependencyProperty as the backing store for IsoStoreFileName. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IsoStoreFileNameProperty =
DependencyProperty.RegisterAttached("IsoStoreFileName", typeof(string), typeof(IsoStoreImageSource), new PropertyMetadata("", Changed));
private static void Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
Image img = d as Image;
if (img != null)
{
var path = e.NewValue as string;
SynchronizationContext uiThread = SynchronizationContext.Current;
Task.Factory.StartNew(() =>
{
using (var isoStore = IsolatedStorageFile.GetUserStoreForApplication())
{
if (isoStore.FileExists(path))
{
var stream = isoStore.OpenFile(path, System.IO.FileMode.Open, FileAccess.Read);
uiThread.Post(_ =>
{
var _img = new BitmapImage();
_img.SetSource(stream);
img.Source = _img;
}, null);
}
}
});
}
}
}
Я использую это внутри элемента управления ListBox. И если попробуйте с изображениями библиотеки по умолчанию, все будет работать так, как ожидалось. Но если я попытаюсь с изображениями с большим размером (взятым через камеру устройства), приложение выйдет из строя.
А вот исключение, что я получаю
исключение типа «System.OutOfMemoryException» произошло в System.Windows.ni.dll, но не был обработан в пользовательском коде
трассировки стека
на MS.Internal.FrameworkCallbacks.NotifyManagedDebuggerOnNativeOOM() в MS.Internal.XcpImports.BitmapSource_SetSource (BitmapSource BitmapSource, CValue & потоковый) в System.Windows.Media.Imaging.BitmapSource.SetSourceInternal (Stream Streams ource) в System.Windows.Media.Imaging.BitmapImage.SetSourceInternal (Stream streamSource) в System.Windows.Media.Imaging.BitmapSource.SetSource (поток streamSource) на MyaPP.Common.IsoStoreImageSource. <> c__DisplayClass4. <> c__DisplayClass6.b__1 (Object _)
Сколько изображений вы видите в списке? Насколько они большие?Можете ли вы запустить анализ памяти в своем приложении («Отладка -> Запустить анализ приложений Windows Phone -> Профилирование -> Память» в Visual Studio) и опубликовать результаты? – Haspemulator
Попробуйте использовать LongListSelector как Flat List – Mahantesh
@Haspemulator: проблема упоминается здесь «http://stackoverflow.com/questions/15700340/out-of-memory-exception-while-loading-images-from-isolated-storage» , «http://blogs.developpeur.org/kookiz/archive/2013/02/17/wpdev-memory-leak-with-bitmapimage.aspx», как я могу решить эту проблему с вашей реализацией. –