列表框中有超过100个项目崩溃

时间:2014-06-11 14:42:56

标签: c# windows-phone-8 listbox windows-phone listboxitems

我正在使用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 个答案:

答案 0 :(得分:3)

确保列表框的ItemsPanelTemplate中有VirtualizingStackPanel see this answer for more info

以下是ListBox可能需要的XAML:

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

答案 1 :(得分:1)

您需要阅读msdn关于列表和网格中数据可视化的以下博客。

<强> Using virtualization with a list or grid

没有看到你的整个xaml代码,我无法建议确切的答案,但我的猜测是你在xaml ListBox中放置在canvas / StackPanel或scrollviewer控件内。

  

如果ItemsControl的视口大小不受限制,则控件不会执行虚拟化。相反,它为其集合中的每个项目创建一个项容器。一些不限制视口大小的常见容器是Canvas,StackPanel和ScrollViewer。您可以通过直接设置ItemsControl的大小来启用虚拟化,而不是通过其父容器调整大小。   在这里,我们在GridView上设置高度和宽度。这会限制视口的大小,并且视口外部的项目将被虚拟化。

下面是两个场景,一个会抛出内存异常而其他会正常工作(使用相同的代码并测试)

<强> 1。画布中的ListBox

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

上面的代码会抛出内存异常,因为没有定义项控件的视口(如果你仍然想要使用Canvas而不是定义宽度/高度,如果ListBox在这种情况下定义了Items控件的端口,美化将适用

<强> 2。网格中的ListBox

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

上面的代码不会因为在列表框上应用虚拟化而抛出内存不足。

希望这会有所帮助

答案 2 :(得分:-1)

你的对象有多大?如果您的对象太大,您可能无法一次加载它们。

答案 3 :(得分:-1)

您是否尝试使用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; }
}

希望它有所帮助......根据您的意愿改变视图模型