none
WPF ListBox 绑定图片 RRS feed

  • 问题

  • WPF ListBox 绑定图片当使用 WrapPanel 显示图片,如果文件太大,会直接挂掉,是什么原因啊?如果不使用 WrapPanel,显示还是很快的,使用了 WrapPanel 模板,直接慢了好多,有种要疯掉的感觉。如果不使用 WrapPanel, 有什么好的办法来达到 WrapPanel 那样的效果?
    2012年10月16日 3:12

答案

全部回复

  • WrapPanel挂掉是什么意思, 你怎么也的说明一下抛出的是什么异常吧.
    2012年10月16日 8:28
  • 程序挂掉,没有异常,加载太慢,我都等不到它加载完,直接关掉了,时间长了的话,程序直接自己关了。如果非要来个异常,那就是时间太长(没有响应)。就一句话,WrapPanel 加载图片太慢。

    2012年10月16日 16:22
  • 你应该提供更多的资料,这样我们才能帮助你

    例如图片的数量,图片的大小,甚至是部分代码。


    Wanpeng wanpeng.ones@gmail.com

    2012年10月17日 2:47
  • 图片数量:757

    图片总大小:101M

    XAML:

    <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="30"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
                <Button Grid.Row="0" Click="Button_Click" >获取图片</Button>
            <ListBox Grid.Row="1" Name="lbxImages" ItemsSource="{Binding}">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition />
                                <RowDefinition />
                            </Grid.RowDefinitions>
                            <Image Source="{Binding ImgPath}" Grid.Row="0" Width="130"/>
                            <TextBlock Text="{Binding ImgName}" Grid.Row="1" Width="130"/>
                        </Grid>
                    </DataTemplate>
                </ListBox.ItemTemplate>
                <ListBox.ItemsPanel>
                    <ItemsPanelTemplate>
                        <WrapPanel />
                    </ItemsPanelTemplate>
                </ListBox.ItemsPanel>
            </ListBox>
        </Grid>

    cs:

    public partial class MainWindow : Window
        {
            List<Images> list = new List<Images>();
            public MainWindow()
            {
                InitializeComponent();
              
            }

            private void BindImg()
            {
                string path = @"F:\图片\背景";
                DirectoryInfo di = new DirectoryInfo(path);
                foreach (var i in di.GetFiles())
                {
                    Images img = new Images();
                    img.ImgPath = i.FullName;
                    img.ImgName = i.Name;
                    list.Add(img);
                }
                this.lbxImages.DataContext = list;
            }

            private void Button_Click(object sender, RoutedEventArgs e)
            {
                BindImg();
            }
        }
        public class Images
        {
            public string ImgPath { get; set; }
            public string ImgName { get; set; }
        }

    把 ListBox 的 WrapPanel 模板取消,便会很快,但加上 WrapPanel,问题就出现了(图片加载太慢)。

    2012年10月19日 5:23
  • 因为ListBox默认的ItemsPanel默认是VirtualizingStackPanel,虚拟化面板,而WrapPanel则将全部数据一次性加载,自然会导致UI阻塞。

    这是一篇VirtualizingWrapPanel的文章,我没有测试过,你可以试试,如果有用,让我们知道。

    http://www.codeproject.com/Articles/75847/Virtualizing-WrapPanel


    Wanpeng wanpeng.ones@gmail.com

    2012年10月19日 7:22
  • 谢谢,对我有用,只是源码在我这里下载总出错,慢慢研究中。。。。

    2012年10月22日 1:57