Список со сбоями более 100 предметов

Я работаю над приложением Windows Phone 8.

У меня есть список с более чем 200 пунктов для отображения.

<DataTemplate x:Key="DataTemplate1">
            <Grid VerticalAlignment="Center" HorizontalAlignment="Center">
                <Grid.RowDefinitions>
                    <RowDefinition/>
                </Grid.RowDefinitions>
                <Border Grid.Row="0" Background="White" Height="400" Width="400" CornerRadius="30,30,30,30">
                </Border>
                <Grid Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Top">
                    <TextBlock HorizontalAlignment="Center" 
                               VerticalAlignment="Center"
                               Margin="5,20,5,5"
                               Foreground="#000000"
                               Text="{Binding Title}"/>
                </Grid>

            </Grid>
        </DataTemplate>

Но он вылетает, я отлаживал до 100 пунктов, он работает, но после этого он вылетает.

в PhoneApplicationPage_Loaded метод у меня есть

private void PhoneApplicationPage_Loaded(object sender, System.Windows.RoutedEventArgs e)
        {
myList.Add(new MyObject("A","A value"));
            myList.Add(new MyObject("B", "B value"));
            myList.Add(new MyObject("C", "C value"));

and so on... 200 items

ListBoxItems.ItemsSource = myList;
}

Как я могу это исправить?

Обновить:

<ItemsPanelTemplate x:Key="ItemsPanelTemplate">
            <local:CollectionFlowPanel ItemHeight="400" 
                                       ItemWidth="400"
                                       FocusedItemOffset="120" 
                                       UnfocusedItemOffset="20" 
                                       ItemVisibility="5">
                <VirtualizingStackPanel />
            </local:CollectionFlowPanel>
        </ItemsPanelTemplate>
    </phone:PhoneApplicationPage.Resources>

    <Grid x:Name="LayoutRoot" Background="#000000">
        <local:CollectionFlow x:Name="ListBoxItems"
                              ItemTemplate="{StaticResource DataTemplate}" 
                              ItemsPanel="{StaticResource ItemsPanelTemplate}"/>
    </Grid>

4 ответа

Убедитесь, что у вас есть VirtualizingStackPanel внутри ItemsPanelTemplate вашего списка, см. Этот ответ для получения дополнительной информации.

Вот XAML, который вам, вероятно, нужен для вашего ListBox:

<ListBox.ItemsPanel>
    <ItemsPanelTemplate>
        <VirtualizingStackPanel />
    </ItemsPanelTemplate>
</ListBox.ItemsPanel>

Вам нужно прочитать следующий блог из msdn по визуализации данных в списке и сетке.

Использование виртуализации со списком или сеткой

Не видя весь ваш код xaml, я не могу предложить точный ответ, но я предполагаю, что вы в xaml ListBox размещены внутри элемента управления canvas/StackPanel или scrollviewer.

Если размер области просмотра ItemsControl не ограничен, элемент управления не выполняет виртуализацию. Вместо этого он создает контейнер для каждого элемента в своей коллекции. Некоторыми распространенными контейнерами, которые не ограничивают размер области просмотра, являются Canvas, StackPanel и ScrollViewer. Вы можете включить виртуализацию в этой ситуации, установив размер ItemsControl напрямую, вместо того, чтобы позволять ему измеряться родительским контейнером. Здесь мы устанавливаем высоту и ширину в GridView. Это ограничивает размер области просмотра, и элементы вне области просмотра виртуализируются.

Ниже приведены 2 сценария: одно исключение из памяти, а другое будет работать нормально (используйте тот же код и протестируйте)

1. ListBox в Canvas

 <Canvas .....
    <ListBox Name="ListBoxItems".....
    </ListBox>
 </Canvas>

Приведенный выше код будет исключать из памяти исключение, так как область просмотра элемента управления не определена (если вы все еще хотите использовать Canvas, чем определять ширину / высоту, если ListBox в этом случае определен порт элемента управления "Элементы" и будет применена виртуализация)

2. ListBox в сетке

  <Grid .....
    <ListBox Name="ListBoxItems".....
    </ListBox>
 </Grid>

Приведенный выше код не выдает исключение из памяти, так как виртуализация применяется к списку.

Надеюсь, это поможет

Насколько большой ваш объект? Если ваш объект слишком большой, вы не сможете загрузить их все сразу.

Вы пытались использовать цикл for?

public List<Fellow> fellowList { get; set; }

private void PhoneApplicationPage_Loaded(object sender, System.Windows.RoutedEventArgs e)
{

fellowList = new List<Fellow>();

for (int i = 0; i < 2; i++)
{
    Fellow fellow = new Fellow();
    fellow.x = "B" + i;
    fellow.value = "B Value" + i;
    fellowList.Add(fellow);
}
this.DataContext = this;

ListBoxItems.ItemsSource = fellowList;    

}

public class Fellow
{
public string x { get; set; }
public string value { get; set; }
}

Надеюсь, что это поможет.. изменить модель представления по вашему желанию

Другие вопросы по тегам