Windows phone 7 асинхронно добавляет элементы в панель стека

Мне интересно, можно ли асинхронно добавлять дочерние элементы в панель стека (или любой другой элемент). Кажется, что все элементы отображаются сразу.

не имеет значения, использую ли я фонового рабочего или диспетчера. Всегда результат один и тот же - когда все элементы добавлены, они отображаются.

Я хотел бы иметь что-то вроде этого:

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));
    }
});

с уважением Макс


person maxlego    schedule 29.04.2012    source источник


Ответы (2)


Этот фрагмент добавляет новый TextBlock в stackPanel каждые 500 мс без зависания пользовательского интерфейса. Элемент виден в пользовательском интерфейсе сразу после его добавления:

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});
                  });
                }
            });
person Pashec    schedule 30.04.2012

Вам следует использовать класс ObservableCollection. для хранения элементов, которые вы хотите отобразить. Этот класс реализует INotifyCollectionChanged, который позволит ему обновлять пользовательский интерфейс по мере добавления и удаления элементов.

Вот некоторые дополнительные сведения о привязке к ObservableCollection и обновление пользовательского интерфейса по мере добавления элементов (см. эту демонстрацию).

Также вам может потребоваться добавить/удалить элементы с помощью Диспетчер.

person Greg Bray    schedule 29.04.2012