0

我有一个简单的 foreach 语句,它创建一个用户控件并将其添加到 stackPanel 控件(参见下面的代码)。Products 只是一个整数列表。

 foreach (int id in Products)
 {
   ItemControl itemControlProduct = new ItemControl (id );
   this.StackPanelControl.Children.Add(itemControlProduct);
 }

如果列表有大约 50 个项目(产品),这很好用,但是一旦它结束,我的应用程序就会拒绝呈现。(即没有出现异常,windows任务管理器说程序运行正常,但没有出现窗口)

我怎么解决这个问题。我需要加载 600 多个项目。ps 我不想使用分页。我希望一次列出所有元素。

4

2 回答 2

1

StackPanel 不是您要查找的父控件。使用 ListView,它利用了一个虚拟化面板(VirtualizingStackPanel)并且有很多好东西,例如用于选择事物的事件,在不改变背后逻辑的情况下改变外观等。

“虚拟化”部分意味着只有有限数量的 UI 控件在运行时呈现,无论您在容器中放置了多少项目。

有很多方法可以做到,下面的示例只是假设最少的示例:

<ListView ItemsSource="{Binding ...your binding to Products}">
    <ListView.View>
        <GridView>
<GridViewColumn Width="100">
    <GridViewColumnHeader>
        <TextBlock Text="Item"/>
   </GridViewColumnHeader>
   <GridViewColumn.CellTemplate>
        <DataTemplate>
            <ItemControl ItemId="{Binding Path=id}"/> <!-- this is for Product.id, you'll have to change it-->
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>
于 2013-04-02T13:45:57.710 回答
1

这不是一个直接的答案,但我强烈建议不要使用这种使用控件的“代码隐藏”方式。WPF 是针对数据绑定的。创建一个在集合中包含 600 个项目的视图模型,并让 WPF 完成艰苦的工作。

考虑使用ItemsControl设置ItemsPanel为 a 的 a VirtualizingStackPanel。这将确保控件仅在它们变得可见时创建。将属性绑定ItemsSource到您的集合。

<ItemsControl ItemsSource="{Binding MyModel.MyCollection}">
 <ItemsControl.ItemsPanel>
   <VirtualizingStackPanel/>
 </ItemsControl.ItemsPanel>
</ItemsControl>
于 2013-04-02T13:47:58.580 回答