我有一个listview,它使用以下代码:
<ListView x:Name="Display" ItemsSource="{Binding}" Background="#373737" Margin="0,0,350,0" BorderThickness="0" >
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Width="767" Height="88">
<Border Height="64" Width="64" Margin="12,12,0,12">
<Image Source="{Binding Path=album.albumart}" Stretch="UniformToFill"/>
</Border>
<StackPanel Orientation="Vertical" VerticalAlignment="Top" Margin="0,10,0,0">
<TextBlock Text="{Binding Path=name}"
Margin="10,0,0,0" Width="300" Height="40"
TextTrimming="WordEllipsis" TextWrapping="Wrap" FontSize="16" HorizontalAlignment="Left"/>
<TextBlock Text="{Binding Path=album.name}"
Margin="10,-15,0,0" Width="300" Height="20"
TextTrimming="WordEllipsis" HorizontalAlignment="Left"
FontSize="14" Opacity="0.49"/>
<TextBlock Text="{Binding Path=artistname}"
Margin="10,2,0,0" Width="300"
TextTrimming="WordEllipsis" HorizontalAlignment="Left"
FontSize="12" Opacity="0.49"/>
</StackPanel>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
我有大约400个图像对象(这需要相当多的内存)
然后在每个listviewitem中显示哪些内容.
列表视图是否有任何方法可以告诉项目从缓存中加载图像我基于哪些对象在列表视图中可见而不是一直加载所有图像,如前所述需要相当多的内存.
希望你们明白我的意思,谢谢.
最佳答案 我用我的图片文件夹尝试了这个解决方案,其中包含3500多张高分辨率图片.内存使用率达到120MB,激烈的滚动似乎会触发垃圾收集并将内存减少到大约50MB.我不知道内存使用率是否足够低?
<ListBox ItemsSource="{Binding Images}" VirtualizingPanel.IsVirtualizing="True">
<ListBox.ItemTemplate>
<DataTemplate>
<Image Height="64" Width="64">
<Image.Source>
<BitmapImage
DecodePixelHeight="64"
DecodePixelWidth="64"
UriSource="{Binding Path=., Mode=OneWay,UpdateSourceTrigger=Explicit}"
CreateOptions="DelayCreation"
CacheOption="None" />
</Image.Source>
</Image>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
视图模型:
public class ViewModel : INotifyPropertyChanged
{
public ICollectionView Images { get; private set; }
public ViewModel()
{
}
public void LoadImages()
{
var folder = @"C:\Users\lrved_000\Pictures";
var photos = System.IO.Directory.EnumerateFiles(folder, "*.jpg",SearchOption.AllDirectories);
Images = CollectionViewSource.GetDefaultView(photos);
RaisePropertyChanged("Images");
}
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string propName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
}