要如何解决listbox开启虚拟化的情况下,加载多个图片的缩略图的进程内存不停增加的问题?

weixin_38050362 2016-11-03 11:35:19
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开启虚拟化的情况下,加载多个图片的缩略图的进程内存不停增加的问题?主要原因是什么?

...全文
28 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复

474

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧