在windows phone 7应用程序中,我正在使用远程图像填充一个列表框..由于图像未立即下载,我想加载默认图像,直到远程图像准备就绪。这样做的最佳方式是什么?
到目前为止,我有以下代码skelton:
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) });
}
}
}
答案 0 :(得分:0)
如果您知道需要多少图像,则应首先创建默认图像的数量。直接在项目中加载一些图像文件,并将其用作默认图像的imageSource。然后,当您完成下载远程图像时,应为每个图像设置新的图像源。
当我遇到类似的问题时,我在定义哪个确切下载的图像引用页面上的哪个对象时遇到了一些问题。 (因为你还记得WebClient对象是异步工作的,所以如果你在页面上有10个图像并且一次下载10个远程图像就不能说第一个下载的图像是页面上的第一个)为了解决这个问题你可以创建更复杂的下载方法(我使用委托来传输图像的id /名称)或使用递归(第一个图像的开始下载方法,下载它,在页面上设置一个源代码,下载下一个......)。