1

子をstackpanel(または他の要素)に非同期で追加できるかどうか疑問に思っています。すべてのアイテムが一度にレンダリングされるようです。

バックグラウンドワーカーとディスパッチャーのどちらを使用するかは関係ありません。結果は常に同じです。すべてのアイテムが追加されると、それらが表示されます。

私が欲しいのはこのようなものです:

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

このスニペットは、UIをフリーズすることなく、500ミリ秒ごとに新しいTextBlockをstackPanelに追加します。アイテムは、追加された直後に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 に答える