В моем (Silverlight) погодном приложении я загружаю до 6 отдельных изображений метеорологических радиолокаторов (каждое из которых занимает около 20 минут) с веб-сайта, и мне нужно отобразить каждое изображение в течение секунды, а затем в конце цикла, сделать паузу в 2 секунды, затем снова запустить цикл. (Это означает, что цикл изображений будет воспроизводиться до тех пор, пока пользователь не нажмет кнопку «назад» или «домой», чего я и хочу.)
Итак, у меня есть класс RadarImage следующим образом, и каждое изображение загружается (через WebClient), а затем загружается в экземпляр RadarImage, который затем добавляется в коллекцию (то есть: List<RadarImage>
) ...
//Following code is in my radar.xaml.cs to download the images....
int imagesToDownload = 6;
int imagesDownloaded = 0;
RadarImage rdr = new RadarImage(<image url>); //this happens in a loop of image URLs
rdr.FileCompleteEvent += ImageDownloadedEventHandler;
//This code in a class library.
public class RadarImage
{
public int ImageIndex;
public string ImageURL;
public DateTime ImageTime;
public Boolean Downloaded;
public BitmapImage Bitmap;
private WebClient client;
public delegate void FileCompleteHandler(object sender);
public event FileCompleteHandler FileCompleteEvent;
public RadarImage(int index, string imageURL)
{
this.ImageIndex = index;
this.ImageURL = imageURL;
//...other code here to load in datetime properties etc...
client = new WebClient();
client.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
client.OpenReadAsync(new Uri(this.ImageURL, UriKind.Absolute));
}
private void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
if (e.Error == null)
{
StreamResourceInfo sri = new StreamResourceInfo(e.Result as Stream, null);
this.Bitmap = new BitmapImage();
this.Bitmap.SetSource(sri.Stream);
this.Downloaded = true;
FileCompleteEvent(this); //Fire the event to let the app page know to add it to it's List<RadarImage> collection
}
}
}
Как вы можете видеть, в приведенном выше классе я представил обработчик событий, чтобы сообщить странице своего приложения, когда загрузится каждое изображение. Когда они все загрузили, я запустил следующий код на своей странице xaml - но только последнее изображение когда-либо показывалось, и я не могу понять, почему!
private void ImageDownloadedEventHandler(object sender)
{
imagesDownloaded++;
if (imagesDownloaded == imagesToDownload)
{
AllImagesDownloaded = true;
DisplayRadarImages();
}
}
private void DisplayRadarImages()
{
TimerSingleton.Timer.Stop();
foreach (RadarImage img in radarImages)
{
imgRadar.Source = img.Bitmap;
Thread.Sleep(1000);
}
TimerSingleton.Timer.Start(); //Tick poroperty is set to 2000 milliseconds
}
private void SingleTimer_Tick(object sender, EventArgs e)
{
DisplayRadarImages();
}
Итак, вы можете видеть, что у меня есть статический экземпляр класса таймера, который останавливается (если работает), тогда цикл должен показывать каждое изображение в течение секунды. Когда все 6 отображены, происходит пауза, запускается таймер и через две секунды снова вызывается метод DisplayRadarImages ().
Но, как я уже говорил, по какой-то причине я могу показать только последнее изображение, и я не могу заставить его работать должным образом.
Я довольно новичок в разработке WP7 (хотя и не в .Net), поэтому просто задаюсь вопросом, как лучше всего это сделать - я думал попробовать это с помощью элемента управления веб-браузера, но наверняка должен быть более элегантный способ циклического просмотра куча картинок!
Извините, что это так долго, но любая помощь или предложения будут очень признательны.
Mike