Windows phone 7 当我向列表框中添加许多项时,我会得到OutOfMemoryException。如何修改它?

Windows phone 7 当我向列表框中添加许多项时,我会得到OutOfMemoryException。如何修改它?,windows-phone-7,Windows Phone 7,这是我的列表框: XMLA: 代码隐藏: private void Button_Click(object sender, RoutedEventArgs e) { for (int i = 0; i < 50; i++) { MyData.Add(new Data { Name = i.ToString(), Img = "/Background.png" }); } } private

这是我的列表框:

XMLA:


代码隐藏:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        for (int i = 0; i < 50; i++)
        {
            MyData.Add(new Data { Name = i.ToString(), Img = "/Background.png" });
        }
    }
private void按钮\u单击(对象发送者,路由目标)
{
对于(int i=0;i<50;i++)
{
添加(新数据{Name=i.ToString(),Img=“/Background.png”});
}
}
当我点击更多按钮时,我得到一个OutOfMemoryException


但是,如果我不设置列表框样式。我将项目添加到列表框中,项目就可以正常工作。

当您重新部署
列表框时,您将丢失数据虚拟化。因此,您的所有项目图像始终都在内存中。您能否减小映像的大小以避免高内存消耗?

我想,要启用虚拟化,您应该更改ListBox ControlTemplate。将除ItemsPresenter之外的所有项目移出ScrollViewer:

<ControlTemplate TargetType="ListBox">
  <Grid>
     <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition Height="100"/>
     </Grid.RowDefinitions>
     <ScrollViewer x:Name="ScrollViewer" Grid.Row="0">
          <ItemsPresenter />
     </ScrollViewer>
     <Button Content="Add" Grid.Row="1" Click="Button_Click"/>
  </Grid>
</ControlTemplate>


并确保MyData实现IList接口。

噢。我的列表框必须有图像。你能告诉我如何重新部署我的列表框而不丢失数据虚拟化吗?你可以这样做的方法之一:删除“更多”
按钮
并检测底部压缩状态以加载下一个项目我找到解决方案用户Scrollviewer和项目控件以组成ListBox@Ku6opr我认为虚拟化是通过虚拟化面板实现的,它与重新模板??MyData实现IList接口无关。将除ItemsPresenter之外的所有内容移出ScrollViewer。在这种情况下,虚拟化仍然是禁用的,也许值得为ListBox使用默认的ControlTemplate,并在ListBox附近放置“Add”按钮。感谢您发布本期文章,了解这些限制非常重要。我以前从未读过这方面的内容。如果编辑ListBox的样式,则ListBox将禁用虚拟化。
<ControlTemplate TargetType="ListBox">
  <Grid>
     <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition Height="100"/>
     </Grid.RowDefinitions>
     <ScrollViewer x:Name="ScrollViewer" Grid.Row="0">
          <ItemsPresenter />
     </ScrollViewer>
     <Button Content="Add" Grid.Row="1" Click="Button_Click"/>
  </Grid>
</ControlTemplate>