Список со сбоями более 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; }
}
Надеюсь, что это поможет.. изменить модель представления по вашему желанию