Windows Phone 8.0 列表框内存不足扩展

Windows Phone 8.0 ListBox Out Of Memory Extension

对不起我的英语。 我执行下一个代码: 在 XAML ...

<Button Content="Add More" Width="160"  Click="Button_Click_2"/>  
<ListBox x:Name="list"/>

...

CS ...

 for (int i = 0; i < 20; i++)
            {
             list.Items.Add(new Image { Source = new BitmapImage { UriSource = new Uri("http://pravda-team.ru/eng/image/photo/4/7/4/73474.jpeg") } });
            }

...

此代码有效,但如果我点击按钮几次,就会出现异常 "Out Of Memory Extension" 我尝试使用垃圾收集器和自动缓存,但错误仍然存​​在。 我在下一个屏幕截图中看到了这个扩展:

我认为当您的 ListBox 在另一个 ScrollViewerStackPanel 中时可能会发生这种情况。通常 ListBox 有自己的 ScrollViewer,它只渲染当前可见的项目。但是如果你把 ListBox 放在 ScrollViewer 里面,那么整个 ListBox 必须被渲染,你会遇到内存异常。

这种布局会产生问题:

<StackPanel x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    <Button Content="add more"
            Grid.Row="1" Click="Button_Click"/>
    <ListBox x:Name="list1" Grid.Row="0"/>
</StackPanel>

但是这个会很好、快速、流畅地工作:

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <ListBox x:Name="list1" Grid.Row="0"/>
    <Button Content="add more"
            Grid.Row="1" Click="Button_Click"/>
</Grid>

如果您希望 ListBox 正确滚动,则必须限制其大小。您可以通过将它放在 Grid 布局中来实现,但设置硬编码高度也可以。 ListBox 必须知道其视口的大小才能优化项目渲染。