0

私は標準を実行しようとしています - 非常に迅速かつスムーズな方法で REST API 呼び出しから受信したデータ (画像を含む) のリストをバインドします - それ自体がパラドックスです。それぞれが完了するまでに約 2 秒かかる 2 つのサービス呼び出しがあるので、それらを非同期/待機できますが、返されたデータに基づいて、メモリ内に他のリスト (observableCollection) を作成し、それらをページ内の ListBox にバインドします。

問題:

  1. この実際のバインディングは UI スレッドをロックしているようです。ページを非同期にロードするにはどうすればよいですか? プレースホルダー画像を配置したいのですが、最終的にバインドされると、プレースホルダーはバインドされた画像に置き換えられます。何か案は?フレームワーク?ツール?

  2. 実際の画像をバインドするとき、DataTemplate の他のデータは、画像がレンダリングされている間、実際に画面を飛び回ります。それはひどいように見えます...少なくとも、最初に画像をバインドし、次にdataTemplateの他のコントロールをバインドできるようにしたいと思いますか? 少し滑らかに見えるようにするものは何でも役立ちます。

前もって感謝します。

4

2 に答える 2

0

(1) アイテムのリストが大きい場合、それらを一度にバインドすると、UI スレッドで何らかのストールが発生します。1 つの修正方法は、アイテムを一度にいくつか追加して一時停止し、続行する前に UI スレッドが新しいフレームをコンポジターに取得できるようにすることです。

public async void AddObjects(List<object> objects)
{
    for(int i = 0; i < objects.Count; i++)
    {
        _myObservableCollection.Add(objects[i]);
        if(i % 10 == 0) await Task.Delay(100);
    }
}

(2) DataTemplate 内の画像に固定の幅と高さを設定して、画像が実際にダウンロードされても変更されないようにする必要があります。または、API 呼び出しでサービスから幅と高さを取得できる場合は、ダウンロードする前に画像の幅と高さをそれらの値にバインドします。

于 2013-05-09T00:10:18.640 に答える
0

(2)の問題は、プレースホルダー画像で解決されると思います(ダウンロードした画像と同じサイズであると仮定します)。

(1)の「ロックアップ」の問題は、メソッドを呼び出しているWaitResult、メソッドTaskによって返されていることだと思いますasync最近の MSDN の記事私のブログで説明しているように、多くの場合、これはデッドロックを引き起こします。

あなたが本当に望んでいるのは、を開始して、Task完了時にデータバインディング通知を受け取る方法だと思います。この状況で役立つ一連の型 ( TaskCompletionNotifier)を開発しました。サンプルについては、プロパティに関する私のブログ投稿asyncの最後を確認してください。コンストラクターに関する私のブログ投稿にasyncも興味があるかもしれません。

于 2013-05-08T22:34:59.277 に答える