0

Windows Phone 7 アプリケーションで、1 つのリストボックスにリモート イメージを入力しています。イメージがすぐにダウンロードされないため、リモート イメージの準備が整うまでデフォルト イメージをロードします。これを行う最善の方法は何ですか?

これまでのところ、次のコード スケルトンがあります。

public partial class RemoteImage : PhoneApplicationPage
{
    ObservableCollection<Image> images = new ObservableCollection<Image> { };

    public RemoteImage()
    {
        InitializeComponent();

        listImage.ItemsSource = GetAllImages();
    }

    private ImageSource GetImageSource(string fileName)
    {
        return new BitmapImage(new Uri(fileName, UriKind.Absolute));
    }

    private ObservableCollection<Image> GetAllImages() 
    {
        WebClient restClient = new WebClient();
        restClient.OpenReadAsync(new Uri(@"http://www.my-api.com"));
        restClient.OpenReadCompleted += new OpenReadCompletedEventHandler(onReadComplete);

        return images;
    }

    private void onReadComplete(object sender, OpenReadCompletedEventArgs args)
    {
        Stream stm = args.Result;

        DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(RootObject));
        RootObject ro = (RootObject)ser.ReadObject(stm);

        foreach (var item in ro.items)
        {
            images.Add(new Image{ PhotoSource = GetImageSource(item.image.link) });    
        }
    }    
}    
4

1 に答える 1

0

必要な画像の数がわかっている場合は、最初にデフォルトの画像の数を作成する必要があります。プロジェクトで画像ファイルを直接ロードし、デフォルト画像の imageSource として使用します。次に、リモート イメージのダウンロードが完了したら、それぞれに新しいイメージ ソースを設定する必要があります。

同様の問題が発生したとき、正確にダウンロードされた画像がページ上のどのオブジェクトを参照しているかを定義する際に問題が発生しました。(覚えているように、WebClient オブジェクトは非同期で動作するため、ページに 10 個の画像があり、一度に 10 個のリモート画像をダウンロードした場合、最初にダウンロードした画像がページの最初のものであるとは言えません) これを解決するには、より複雑なダウンロードを作成できます。メソッド (イメージの ID/名前を転送するためにデリゲートを使用しました) または再帰を使用します (最初のイメージのダウンロード メソッドを開始し、ダウンロードし、ページ上の 1 つのソースを設定し、次のイメージをダウンロードします...)。

于 2012-12-27T05:30:15.187 に答える