我有一个列表框,它绑定到ObservableCollection并使用filename来显示图像
我的xaml是:
<Window x:Class="ThumbnailsView.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="578" WindowStartupLocation="CenterScreen">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="55"/>
</Grid.RowDefinitions>
<ListBox Grid.Row="0" x:Name="ImageListbox"
ItemsSource="{Binding}"
Background="AliceBlue" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox Height="16" VerticalAlignment="Top" Margin="0,10,0,0"/>
<Image Margin="10,10,10,0" Height="64" Width="64" VerticalAlignment="Top">
<Image.Source>
<BitmapImage DecodePixelWidth="64" UriSource="{Binding Path=Name}"/>
</Image.Source>
</Image>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
<Button Grid.Row="1" Content="Get Images" Name="getImageBtn" Click="getImageBtn_Click" Width="100" Height="30"></Button>
</Grid>
</Window>
问题是,如果我有一个大集合,它会加载整个图像,并会消耗大量的内存。如何最大限度地减少内存消耗?
答案 0 :(得分:4)
启用UI虚拟化。然后将回收UI控件并使用最少量的内存。
你也可以加载缩略图而不是完全成熟的照片。
要阅读的一些资源:
http://www.codeproject.com/Articles/34405/WPF-Data-Virtualization https://stackoverflow.com/questions/14456075/how-to-enable-ui-virtualization-in-standard-wpf-listview WPF ListBox with a ListBox - UI Virtualization and Scrolling http://www.zagstudio.com/blog/497#.UQKxpScqb6U
答案 1 :(得分:0)
加载图像后,将其调整为更可管理的大小,然后释放未使用的大图像。这仍然需要很长时间才能加载,但会占用更少的内存。要减少加载时间,请参阅dutzu's
answer并使用延迟加载和虚拟化。
答案 2 :(得分:0)
使用虚拟化堆栈面板 请查看链接以获取有关如何执行此操作的示例。