Silverlight, C #: обнаружение, когда больше нет изображений - PullRequest
3 голосов
/ 21 декабря 2010

У меня есть список последовательных изображений, которые необходимо загрузить по порядку, когда пользователь нажимает «Далее».Следующая страница определяется добавлением единицы к числу в конце URL, например: http://twoimages.com/image_1 до http://twoimages.com/image_2.Я хочу быть в состоянии определить, когда больше нет изображений для загрузки.Я мог бы использовать событие, но оно запускается только после того, как оно завершилось неудачно и завершило выполнение остальной части моего кода.

public void LoadImage(string ImageUrl)
{
    BitmapImage bmpImage;
    if (this.SilverlightImage.Source is BitmapImage)
    {
        bmpImage = this.SilverlightImage.Source as BitmapImage;
    }
    else
    {
        bmpImage = new BitmapImage();
        bmpImage.DownloadProgress += new EventHandler<DownloadProgressEventArgs>(bitmapImage_DownloadProgress);
    }

    bmpImage.UriSource = new Uri(ImageUrl, UriKind.RelativeOrAbsolute);

    if (this.SilverlightImage.Source == null)
    {
        this.SilverlightImage.Source = bmpImage;    
    }
}

Я хотел бы иметь возможность определять, когда больше нет изображений для загрузки и выполнениядаже не пытайтесь загрузить изображение, которое не существует.

Спасибо,

Аарон

Ответы [ 3 ]

0 голосов
/ 21 декабря 2010

Предполагая, что у вас нет известного числа изображений или некоторых других данных, известных программе во время выполнения, чтобы проверить, является ли URI изображения допустимым, способ справиться с этим будет сделать вызов файловой системы на сервер, чтобы увидеть, существует ли изображение, прежде чем пытаться загрузить его (возможно, путем создания службы, которая возвращает, существует ли данный файл), что кажется гораздо менее эффективным, чем простая попытка загрузить изображение. Поскольку этот вызов службы должен быть асинхронным (так как все вызовы службы выполняются в Silverlight), вы все равно захотите реструктурировать свой код, чтобы прослушивать события, хотя вы могли бы сделать это довольно замкнутым циклом.

Большой вопрос, который я думаю, состоит в том, почему: если вы пытаетесь уменьшить накладные расходы на выполнение остальной части вашего кода, это будет только контрпродуктивно, так как несколько сетевых вызовов почти наверняка потребуют больше накладных расходов / времени, чем любой код, который вы будет работать.

Единственный другой метод, который приходит на ум, - это написать сервис, который возвращает некий сложный объект, содержащий как ваше изображение, так и флаг, чтобы сообщить вам, доступно ли следующее изображение. Это кажется излишним, но, возможно, стоит посмотреть, действительно ли вам нужно узнать, есть ли следующее изображение, прежде чем пытаться его загрузить. Опять же, я хотел бы отметить, что этот сервис должен вызываться асинхронно, поэтому вы в любом случае прослушиваете события, и создаваемый вами сервис не совсем тривиален (вам понадобится какой-нибудь ребенок из WCF). сервис, который будет возвращать сложный объект). Я также считаю, что это решение не стоит проблем.

0 голосов
/ 22 декабря 2010

Наиболее разумный подход к этой проблеме - сначала загрузить «Манифест изображений». Это может быть простой XML-файл или простой Ashx, который генерирует XML. Нет реальной необходимости делать что-то более тяжелое, например, создание службы или использование WCF.

Затем вы используете список URL в этом XML для перехода к вашему методу LoadImage, и вы можете отключить кнопку Next, когда вы доберетесь до последнего (и отключить кнопку Prev, когда вы находитесь на первом). *

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

Если вам действительно нужно

Однако, если вам действительно нужен быстрый способ проверить наличие файла, вы можете использовать экземпляр ClientHTTP для HttpWebRequest, чтобы сделать запрос "HEAD" для файла. Однако это может оказаться более сложным, если вы используете защиту на основе файлов cookie.

0 голосов
/ 21 декабря 2010

Вы можете запросить полный список изображений или их количество в начале, чем начать загрузку ... Я не думаю, что вы можете отправить информацию о следующем изображении с BitmapSource, могут быть зарезервированы байты изображений, но это будет просто взломать

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