2012-02-22 23 views
0

这是我的列表框:当我添加多个项目到ListBox时,我得到OutOfMemoryException。如何修改它?

XMLA:

<Style x:Key="ListBoxStyle" TargetType="ListBox"> 
     <Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}"/> 
     <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled"/> 
     <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="ListBox"> 
        <ScrollViewer x:Name="ScrollViewer"> 
         <Grid> 
          <Grid.RowDefinitions> 
           <RowDefinition Height="{TemplateBinding Height}"/> 
           <RowDefinition Height="100"/> 
          </Grid.RowDefinitions> 
          <ItemsPresenter Grid.Row="0"/> 
          <Button Content="Add" Grid.Row="1" Click="Button_Click"/> 
         </Grid> 
        </ScrollViewer> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> <ListBox Style="{StaticResource ListBoxStyle}" Name="listBox" Height="600" ItemsSource="{Binding MyData}"> 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <StackPanel> 
          <TextBlock Text="{Binding Name}"/> 
          <Image Source="{Binding Img}" Stretch="UniformToFill"/> 
         </StackPanel> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 

代码隐藏:

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" }); 
     } 
    } 

当我点击按钮的更多,我得到一个OutOfMemoryException异常。

但是,如果我没有设置ListBox风格。我将项目添加到列表框中,该项目是工作。

回答

1

当您重新模拟ListBox时,会丢失数据虚拟化。所以,你的所有物品图像始终在内存中。你能减小图像的大小以避免高内存消耗吗?

+0

哦。我的列表框必须有图像。你能告诉我如何重新模板我的列表框,而不会丢失数据虚拟化? – BillyMadisonnn 2012-02-22 11:32:01

+0

你可以这样做的方法之一:删除“更多”'按钮'并检测底部压缩状态以加载下一个项目 – Ku6opr 2012-02-22 11:35:14

+0

我找到了一个解决方案用户Scrollviewer和itemsControl组成一个ListBox – BillyMadisonnn 2012-02-22 11:49:04

0

我想,要启用虚拟化,您应该更改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接口。

+0

MyData实现IList接口。 – BillyMadisonnn 2012-02-22 12:04:39

+0

将ItemsPresenter的所有项目移出ScrollViewer。在这种情况下,虚拟化仍然是禁用的 – BillyMadisonnn 2012-02-22 12:06:41

+0

,可能值得使用ListBox的默认ControlTemplate并将“添加”按钮放在ListBox附近。 感谢您发布此问题,了解这些限制很重要。我从来没有读过这个。 – notacat 2012-02-22 12:52:45

相关问题