Как я могу отобразить несколько изображений в цикле в приложении WP7? - PullRequest
1 голос
/ 13 января 2011

В моем (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

Ответы [ 2 ]

4 голосов
/ 13 января 2011

Вы можете использовать фоновый поток с таймером или сном для периодического обновления элемента управления изображением.

Phim Tiểu Giao - темы в WP7

необходимо отправить обновления в пользовательский интерфейс с

Dispatcher.BeginInvoke( () => { /*  your UI code */ } );
1 голос
/ 13 января 2011

Почему бы вам не добавить последнее изображение дважды в radarImages, установить для таймера значение 1000 и отображать только одно изображение на каждый тик?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...