據斯特凡威克的博客綁定的數據,從圖像釋放內存僅僅是因爲這樣做簡單:清除圖像緩存(釋放內存)時,圖像在XAML
BitmapImage bitmapImage = image.Source as BitmapImage;
bitmapImage.UriSource = null;
image.Source = null;
但是,我怎麼能達到同樣的效果如果我使用的數據在XAML綁定這樣?:
// inside MainPage.xaml
<Button Tap="GetImages">Get Images</Button>
<ListBox ItemSource="{Binding Links}">
<ListBox.ItemTemplate>
<DataTemplate>
<!-- I am not binding to Image's Source directly, because I want to use the bitmap's 'Background creation' option and it's download progress event in the future -->
<Image>
<Image.Source>
<BitmapImage UriSource="{Binding}" CreateOptions="BackgroundCreation"/>
</Image.Source>
</Image>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
//inside MainPage.xaml.cs
public void GetImages(object sender, RoutedEventArgs e) {
(DataContext as ViewModel).GetMeSomeImages();
}
// inside ViewModel.cs
public void GetMeSomeImages() {
List<string> links = ThisMethodGetsLinks();
Links.Clear();
foreach(var link in links)
Links.Add(link);
}
ObservableCollection<string> _links;
public ObservableCollection<string> Links {
get {
if (_links == null)
_links = new ObservableCollection<string>();
return _links;
}
}
在這種情況下,每個按鈕自來水將佔用更多的內存,直到手機/仿真器崩潰。即使Listbox的ItemSource屬性被清除,圖像也不會從內存中釋放。
你是如何試圖釋放列表框中圖像的內存的? – 2012-02-28 00:38:51
好吧,目前在我的應用程序中,我綁定了一個像這樣的圖像,其中MyImage是一個BitmapImage,我創建並存儲在視圖模型中的可觀察集合中,但我需要手動啓動後臺線程並通過Webclient下載。然後,一旦我請求新的圖像,我'清除'Listbox的ItemSource被設置爲的ObservableCollection(通過將每個MyImage的UriSource設置爲null)似乎可以保持內存不變,但它比Xaml解決方案更加冗長。我一直在掃描互聯網尋找基於Xaml的解決方案,但沒有運氣。 –
krdx
2012-02-28 01:02:04