Windows Phone 8.0 ListBox Недостаточно памяти Расширение

Извините за мой английский. Я выполняю следующий код: в XAML...

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

...

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

...

Этот код работает, но если я нажму кнопку несколько раз, возникнет исключение «Расширение нехватки памяти». Я пытался использовать сборщик мусора и автокэширование, но ошибка сохраняется. Я вижу это расширение на следующем снимке экрана: введите здесь описание изображения


person Georgy    schedule 24.02.2015    source источник
comment
Какой телефон вы используете для тестирования? Я попробовал это на своей Lumia 730. Нажимал на кнопку сотни раз и не заметил такой ошибки. Изображения (одно изображение, но много раз) загружаются, все работает быстро и плавно.   -  person Łukasz Rejman    schedule 24.02.2015
comment
Я тестирую на Lumia 620. Для упрощенного перехвата исключения необходимо добавить следующий код в файл App.cs: private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e) { MessageBox.Show(e.ExceptionObject.Message.ToString ()); if (Debugger.IsAttached) { Debugger.Break(); } }   -  person Georgy    schedule 25.02.2015
comment
Да, я тестировал. Проверьте мой ответ.   -  person Łukasz Rejman    schedule 25.02.2015


Ответы (1)


Я думаю, это может произойти, когда ваш ListBox находится внутри другого ScrollViewer или в StackPanel. Обычно 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 должен знать размер области просмотра, чтобы оптимизировать отрисовку элементов.

person Łukasz Rejman    schedule 24.02.2015