0

在 Windows phone 7 应用程序中,我正在用远程图像填充一个列表框.. 因为图像不会立即下载,所以我想加载默认图像,直到远程图像准备好。做这个的最好方式是什么?

到目前为止,我有以下代码骨架:

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/名称)或使用递归(启动第一个图像的下载方法,下载它,在页面上设置一个源,下载下一个......)。

于 2012-12-27T05:30:15.187 回答