首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

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

2012-12-24 
WPF的ListBox加载大量图片卡死的问题问题如下:ListBox的Itemplate是我自己定义的usercontrol,每个usercont

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,现在效率明显提升,只是在滚动的时候会秒卡一下,还是多谢你的意见哈。帮助蛮大的

热点排行