1

我想知道是否可以将子项异步添加到堆栈面板(或任何其他元素)。似乎所有项目都是一次渲染的。

如果我使用后台工作人员或调度程序并不重要。结果总是一样的——当所有项目都被添加后,它们就会被显示出来。

我想要的是这样的:

Deployment.Current.Dispatcher.BeginInvoke(() => {
    foreach (var item in items.Skip(x).Take(pageSize))
    {
        // when this row is executed new item should be visible
        ItemsList.Children.Add(new _ListItem(item));
    }
});

关于最大

4

2 回答 2

4

此代码段每 500 毫秒将新的 TextBlock 添加到 stackPanel 中,而不会冻结 UI。项目在添加后立即在 UI 中可见:

ThreadPool.QueueUserWorkItem(_ => {
                foreach (int item in Enumerable.Range(1,50)) {
                  Thread.Sleep(500);//simulate some calculations here
                  int item1 = item;
                  Deployment.Current.Dispatcher.BeginInvoke(() => {
                      stackPanel.Children.Add(new TextBlock(){Text = "Text "+item1});
                  });
                }
            });
于 2012-04-30T12:40:53.910 回答
1

您应该使用ObservableCollection类来存储要显示的项目。该类实现了INotifyCollectionChanged接口,这将允许它在添加和删除项目时更新 UI。

以下是有关绑定到 ObservableCollection在添加项目时更新 UI的更多详细信息(请参阅此演示)。

此外,您可能需要使用Dispatcher添加/删除项目。

于 2012-04-29T22:50:02.903 回答