【问题标题】:ListBox data virtualization is not taking effectListBox 数据虚拟化未生效
【发布时间】:2011-09-16 07:34:28
【问题描述】:

我有 1000 个来自 xml 的项目并将它们加载到一个 List 对象中。 List 数据绑定到 ListBox,它是水平方向的,因此用户可以从左到右或从右到左翻阅项目。由于项目数量很大,我的应用程序可能由于内存使用过多而退出。如果我将项目减少到 50 个,它会起作用。

我找到了这篇文章 http://shawnoster.com/blog/post/Improving-ListBox-Performance-in-Silverlight-for-Windows-Phone-7-Data-Virtualization.aspx

然后是这篇关于数据虚拟化的文章

http://blogs.msdn.com/b/ptorr/archive/2010/08/16/virtualizing-data-in-windows-phone-7-silverlight-applications.aspx

在实现了实现 IList 的虚拟化类之后,我看不出有什么不同。 this[](如下)仍然被调用了 1000 次,尽管我预计它只会被调用 30-40 次,因为我知道 UI 已经在 Listbox 中虚拟化了。为什么虚拟化没有发挥作用?

object IList.this[int index]
{
    get
    {
        if (index >= cachedItems.Count)
        {
            //replenish cache code here
        }

        return cachedItems[index];
    }
    set
    {
        throw new NotImplementedException();
    }
}

这是与问题相关的 XAML 部分。希望这能提供代码的全貌。不确定Width=Auto 是否与它有关,但我无法更改它,否则我的滑动停止。

<ScrollViewer HorizontalScrollBarVisibility="Auto" Margin="0,0,0,0" Width="auto" x:Name="WordsScrollview" Opacity="1"  Grid.Row="1" RenderTransformOrigin="0.5,0.5">

    <ListBox x:Name="horizontalListBox" Width="auto" Height="Auto" >

        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal">
                </StackPanel>
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>

        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Width="430" Text="{Binding Word}"  TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}" TextAlignment="Center" />
                    <Image Height="290" HorizontalAlignment="Center" Name="image1" Stretch="Fill"  Width="430" Source="{Binding ImageFile}" Margin="10,50,10,0" />
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>

        <ListBox.Background>
            <SolidColorBrush />
        </ListBox.Background>

    </ListBox>

</ScrollViewer>

【问题讨论】:

  • 您应该发布列表框的 XAML - 根据您的描述,我怀疑您将 ItemsPanelTemplate 覆盖为水平方向的 StackPanel,因此列表确实不再虚拟化...
  • 确实,我们需要 XAML,因为数据虚拟化和 UI 虚拟化是两个不同的主题,而这个问题显然是关于 UI 虚拟化的。
  • 刚刚粘贴了 XAML,但由于某种原因,顶部标签 被切断了。基本上这部分

标签: windows-phone-7 listbox virtualization


【解决方案1】:

这是导致 UI 虚拟化最终启动的 XAML。

        <ListBox x:Name="horizontalListBox"   Height="Auto" ScrollViewer.HorizontalScrollBarVisibility="Auto" >

                <ListBox.ItemsPanel>
                    <ItemsPanelTemplate>
                        <VirtualizingStackPanel Orientation="Horizontal">

                        </VirtualizingStackPanel>
                    </ItemsPanelTemplate>
                </ListBox.ItemsPanel>
                <ListBox.ItemTemplate>
                    <DataTemplate>

                            <StackPanel>
                                <TextBlock Width="430" Text="{Binding Word}"  TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}" TextAlignment="Center" />

                                <Image Height="290" HorizontalAlignment="Center" Name="image1" Stretch="Fill"  Width="430" Source="{Binding ImageFile}" Margin="10,50,10,0" />
                               </StackPanel>

                    </DataTemplate>
                </ListBox.ItemTemplate>
                <ListBox.Background>
                    <SolidColorBrush />
                </ListBox.Background>
            </ListBox>

【讨论】:

  • Scrollviewer 有问题吗?
  • 我遇到了同样的问题,删除了包装 ScrollViewer(并添加了 ScrollViewer.Horizo​​ntalScrollBarVisibility="Auto")为我修复了它。
  • @DušanKnežević 注意到 VirtualizingStackPanel 的使用
  • ScrollViewer.Horizo​​ntalScrollBarVisibility 是一个附加属性,当添加到 ListBox 控件时,它会显示自己的滚动条。当添加到 ScrollViewer 中时,它会获得无限空间,从而有效地关闭 UI 虚拟化
【解决方案2】:

在下面的文章中解释了在 ScrollViewer 中包装虚拟化 UI 控件将为其提供无限空间,从而有效地禁用 UI 虚拟化

http://blogs.msdn.com/b/mcsuksoldev/archive/2010/04/13/performance-characteristics-of-the-silverlight-datagrid.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多