Когда я добавляю много элементов в ListBox, я получаю исключение OutOfMemoryException.Как это изменить? - PullRequest
0 голосов
/ 22 февраля 2012

это мой ListBox:

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.Я добавляю элементы в ListBox, проект работает.

Ответы [ 2 ]

1 голос
/ 22 февраля 2012

Когда вы повторяете шаблон ListBox, вы теряете виртуализацию данных. Таким образом, все ваши изображения предметов находятся в памяти все время. Можете ли вы уменьшить размер изображений, чтобы избежать большого потребления памяти?

0 голосов
/ 22 февраля 2012

Полагаю, чтобы включить виртуализацию, вы должны изменить 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...