none
关于 ListBox 的延迟加载问题。 RRS feed

  • 问题

  • 我不确定我的标题表述的是否正确。总之现象就是我循环在的 ListBox 中插入了二十多个 ListBoxItem,该 ListBox 在可见范围内能看见8个 ListBoxItem。

    每个 ListBoxItem 的 Content 都是一个我自己定义的 UserControl,这些个 UserControl 的构造方法中有一些逻辑会被调用。

    但是在运行的时候我发现只有可见区域的8个,再加上紧接这8个后的2个 ListBoxItem 中 UserControl 的构造方法得到执行了,而剩下的十多个 ListBoxItem 中的 UserControl 的构造函数并没有被调用,只有当我把滚动条往下滚的时候才会逐个被调用。

    请问大家,如何能避免这种情况呢?????

    2011年9月16日 6:45

答案

  • 你好,

    这应该是Data Virtualization现象:它不会把所有的数据一次性加载到内存中,而是根据UI所能显示的项加载数据(也就是按需加载)。

    但根据你的描述,又不像是Data Virtualization,因为你说用“循环在的 ListBox 中插入了二十多个 ListBoxItem”,那这样的话,每实例一个你的UserControl ,那构造函数就会被调用。所以应该不会发生你所说的“延迟”现象。

    另外,还有一个与Data Virtualization 相似的概念就是UI Virtualization(数据会一次性加载到内存,但会根据UI上所显示的项去渲染你的UI项,这跟VirtualizingStackPanel  默认情况,VirtualizingStackPanel 是ListBox项的宿主,也就是ItemsPanel)。

    所以你可以尝试一下用没有Virtualization的Panel做为ListBox的宿主,看看会不会发生同样的现象:

        <UserControl.Resources>
            <ItemsPanelTemplate x:Key="ItemsPanelTemplate1">
                <StackPanel/>
            </ItemsPanelTemplate>
        </UserControl.Resources>

         <ListBox ItemsPanel="{StaticResource ItemsPanelTemplate1}">
                .....
         </ListBox>

    如果还会发生,可否将相关代码发在这里给我们看看的,以便找出原因。谢谢!


    Daoping Liu - MSFT
    2011年9月19日 9:26
    版主