Listbox启用虚拟化加载100000个textblock,没有问题,瞬间完成。进程内存占用100MB,移动滚动条进程内存也几乎不变。不知道能不能再减小?
Listbox启动虚拟化加载100个textblock和100个图片

结果:进程内存就已经比加载100000个textblock要多一些,而且还用了7秒时间才响应完成。为什么列表类控件加载多个图片的缩略图几乎都会有内存增长的问题
Listbox启动虚拟化加载1000个textblock和1000个图片textblock

加载图片的响应过程超过1分钟,还没有结束,进程内存还在不停的增加,于是我手动终止程序运行并截了图。
要如何解决Listview加载图片时的内存不停增加等问题?
下面是关键代码
xaml代码部分
<ListBox
x:Name="listBox"
HorizontalAlignment="Left" Height="547"
Margin="34,32,0,0" VerticalAlignment="Top"
Width="662"
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Recycling"
ItemsSource="{Binding
Listboxs}"
>
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<Image
Source="{Binding
Images}" Height="100"
Width="100"></Image>
<TextBlock
Text="{Binding
Name}" Height="20"></TextBlock>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel
Orientation="Vertical" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
//实体类
class Tree
{
public string Name
{ set; get; }
public ImageSource Images
{ set; get; }
}
加载绑定数据
for (long i = 0; i <= 1000; i++)
{
Tree a = new Tree();
a.Images = getSmallImage(@"E:\ 01.jpg");
a.Name = "第" + i + "个数据";
Listboxs.Add(a);
}
//对图片的处理。(从网上拷贝的代码,ChangeBitmapToImageSource的方法过程并没有研究过,所以不是很明白该方法主要做什么)
private ImageSource getSmallImage(string fileName) //将读取到的图片缩略化
{
var src = new System.Drawing.Bitmap(fileName);
var des = new Bitmap(src, src.Width / 10, src.Height / 10);
src.Dispose();
return ChangeBitmapToImageSource(des);
}
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);
public ImageSource ChangeBitmapToImageSource(Bitmap bitmap)
{
IntPtr hBitmap = bitmap.GetHbitmap();
ImageSource wpfBitmap = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
hBitmap,
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
if (!DeleteObject(hBitmap))
{
throw new System.ComponentModel.Win32Exception();
}
return wpfBitmap;
}
//加载绑定数据和图片
加载绑定数据
for (long i = 0; i <= 1000; i++)
{
Tree a = new Tree();
a.Images = getSmallImage(@"E:\ 01.jpg");
a.Name = "第" + i + "个数据";
Listboxs.Add(a);
}
//对图片的处理。(从网上拷贝的代码,方法的过程并没有去研究过,不明白)
private ImageSource getSmallImage(string fileName)
{
var src = new System.Drawing.Bitmap(fileName);
var des = new Bitmap(src, src.Width / 10, src.Height / 10);
src.Dispose();
return ChangeBitmapToImageSource(des);
}
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);
public ImageSource ChangeBitmapToImageSource(Bitmap bitmap)
{
IntPtr hBitmap = bitmap.GetHbitmap();
ImageSource wpfBitmap = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
hBitmap,
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
if (!DeleteObject(hBitmap))
{
throw new System.ComponentModel.Win32Exception();
}
return wpfBitmap;
}
要如何解决listbox开启虚拟化的情况下,加载多个图片的缩略图的进程内存不停增加的问题?主要原因是什么?