超过100项的列表框崩溃
本文关键字:崩溃 列表 100项 超过 | 更新日期: 2023-09-27 18:08:04
我正在开发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>
确保在列表框的ItemsPanelTemplate中有VirtualizingStackPanel,更多信息请参阅此答案
下面是你的ListBox可能需要的XAML:<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
您需要阅读以下来自msdn的关于列表和网格中数据可视化的博客。
使用带有列表或网格的虚拟化
没有看到你的整个xaml代码,我不能建议确切的答案,但我的猜测是,你在xaml ListBox被放置在一个画布/StackPanel或scrollviewer控件。
当ItemsControl的视口大小不受限制时,该控件不执行虚拟化。相反,它为其集合中的每个项创建一个项容器。一些不限制视口大小的常见容器是Canvas, StackPanel和ScrollViewer。在这种情况下,您可以通过直接设置ItemsControl的大小来启用虚拟化,而不是让它由父容器来设置大小。这里,我们在GridView上设置了高度和宽度。这限制了视口的大小,并且视口之外的项目被虚拟化。
下面是两种情况,一种会抛出内存异常,另一种会正常工作(使用相同的代码和测试)
1。Canvas中的ListBox
<Canvas .....
<ListBox Name="ListBoxItems".....
</ListBox>
</Canvas>
上面的代码将抛出内存异常,因为items控件的viewport没有定义(如果你仍然想使用画布,那么定义宽度/高度,如果ListBox在这种情况下,items控件的端口被定义,虚拟化将应用)
2。ListBox in Grid
<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; }
}