读书人

WPF的ListBox加载大量图片卡死的有关问

发布时间: 2012-12-24 10:43:13 作者: rapoo

WPF的ListBox加载大量图片卡死的问题
问题如下:ListBox的Itemplate是我自己定义的usercontrol,每个usercontrol都有一个image,当加载listbox的时候(大概有200个左右usercontrol)会很慢,而且加载完成之后移动鼠标或者滚轮都会造成卡死!!
ListBox代码定义如下:


<ListBox Grid.Column="1" Grid.Row="1" Name="_MonitorDisplayArea"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Recycling"
ScrollViewer.CanContentScroll="False">
<ListBox.CacheMode>
<BitmapCache EnableClearType="False"
RenderAtScale="1"
SnapsToDevicePixels="False"/>
</ListBox.CacheMode>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<local:MonitorState />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>



usercontrol的代码定义如下:

<UserControl x:Class="TaianSUCCEED.MineMonitoringSystem.WPF.UserInterface.MonitorState"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:TaianSUCCEED.MineMonitoringSystem.WPF.UserInterface"
mc:Ignorable="d"
Height="150" Width="200" MouseEnter="UserControl_MouseEnter" MouseLeave="UserControl_MouseLeave" Loaded="UserControl_Loaded">
<UserControl.Resources>
<local:SourceConverter x:Key="sourceConverter"/>
</UserControl.Resources>
<Border BorderThickness="1" CornerRadius="10" BorderBrush="Black">
<Grid Name="_MainGrid">
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="30"/>
<RowDefinition Height="30"/>
<RowDefinition Height="60"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="60"/>
<ColumnDefinition Width="60"/>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Label Content="设备编号:" Grid.Column="1" />
<Label Content="{Binding 设备编号, IsAsync=True}" Grid.Column="2"/>
<Label Content="通道数目:" Grid.Column="1" Grid.Row="1"/>
<Label Content="{Binding 通道数目, IsAsync=True}" Grid.Column="2" Grid.Row="1"/>
<Label Content="{Binding 安装位置}" HorizontalAlignment="Center" Grid.Row="2" Grid.ColumnSpan="3"/>
<Border Grid.RowSpan="2" BorderThickness="0,0,1,1" CornerRadius="3" BorderBrush="Black">


<Image Source="{Binding imagePath, Converter={StaticResource sourceConverter}, IsAsync=True}" RenderOptions.BitmapScalingMode="LowQuality" Name="_monitorImage"/>
</Border>
<Grid Grid.Row="3" Grid.ColumnSpan="3" Name="_MonitorStateGrid">
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="30"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="60"/>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Label Content="连接位置:"/>
<Label Content="状态:" Grid.Column="0" Grid.Row="1"/>

</Grid>
</Grid>
</Border>

</UserControl>


Listbox的itemsource是ObservableCollection<Entity>,usercontrol的DataContext是Entity,有什么好的解决方案么
[最优解释]
首先 图片解析度不要用太高的 可能会稍微好点
200个应该还是ok的吧 对于大数据的话 最好分页显示
然后运用虚拟化技术 具体百度或者谷歌之
[其他解释]
引用:
首先 图片解析度不要用太高的 可能会稍微好点
200个应该还是ok的吧 对于大数据的话 最好分页显示
然后运用虚拟化技术 具体百度或者谷歌之

listbox加了虚拟化的,没有效果,之前是做的分页的,客户说分页还要翻页麻烦,要求单页显示..

[其他解释]
引用:
引用:
首先 图片解析度不要用太高的 可能会稍微好点
200个应该还是ok的吧 对于大数据的话 最好分页显示
然后运用虚拟化技术 具体百度或者谷歌之

listbox加了虚拟化的,没有效果,之前是做的分页的,客户说分页还要翻页麻烦,要求单页显示..

汗 这种客户 真是无奈啊 如果1w条记录他也要不分页 这个太不合理了
虚拟化有好几种 你代码里的是最简单 实际上好像还有更加复杂的哦 不然的话一页那么几十条


肯定是不会卡的 所以 此虚拟化非彼虚拟化 具体还是那句 百度之 原来存的网页换机器 没了
你自己找下吧 网上应该有蛮多人研究过的
在不行就论坛上继续发帖求助 帮顶下先 呵呵

[其他解释]

引用:
引用:

引用:
首先 图片解析度不要用太高的 可能会稍微好点
200个应该还是ok的吧 对于大数据的话 最好分页显示
然后运用虚拟化技术 具体百度或者谷歌之

listbox加了虚拟化的,没有效果,之前是做的分页的,客户说分页还要翻页麻烦,要求单页显示..

汗 这种客户 真是无奈啊 如果1w条记录他也要不分页 这个太不合理了
虚拟化有好几种 ……

嗯,谢谢了哈,我这个虚拟化之所以不成功是由于替换了Listbox的默认panel,之后网上搜索用VirtualizingWrapPanel效果就有提升,不过还是很卡,后来发现原来是我的图片太大了,一张2M....200张就是400M什么机器也受不了,所以把图片弄小了,十几K,现在效率明显提升,只是在滚动的时候会秒卡一下,还是多谢你的意见哈。帮助蛮大的

读书人网 >.NET

热点推荐