Я столкнулся с той же проблемой при попытке программно получить изображения из Facebook.Странно то, что если вы указываете элемент управления изображением Silverlight на URL-адрес изображения Facebook, изображение извлекается и отображается без ошибок.Это заставило меня задуматься, и я нашел жизнеспособный обходной путь, который, кажется, работает последовательно для моей ситуации.Надеюсь, вы тоже найдете его полезным.
var uri = new Uri("http://graph.facebook.com/mglace/picture/", UriKind.Absolute);
var bmp = new BitmapImage();
bmp.ImageOpened += (sender, e) => { /* Do something here with the sender (which is the BitmapImage) */ };
bmp.CreateOptions = BitmapCreateOptions.None;
bmp.UriSource = uri;
Создайте объект BitmapImage
, установите обработчик события для события ImageOpened
и установите для свойства CreateOptions
значение BitmapCreateOptions.None
.Наконец, установите UriSource
на изображение Facebook, которое вы хотите получить.Изображение загружается немедленно, потому что мы установили CreateOptions
на None
(значение по умолчанию DelayedCreation
).Затем вы можете выполнять любые действия, которые вам нужны, в обработчике событий ImageOpened
.
Я хотел инкапсулировать эту логику в свой сервисный уровень и усилить обработку ошибок и так далее, поэтому я обернул ее в наблюдаемые Reactive Extensionsчтобы было проще в использовании.Вот мой последний фрагмент кода:
public IObservable<BitmapImage> GetProfilePhoto(string profileId)
{
return Observable.Create<BitmapImage>(
observer =>
{
// This handler handles a successful fetch
EventHandler<RoutedEventArgs> openedHandler =
(sender, args) =>
{
try
{
observer.OnNext(sender as BitmapImage);
observer.OnCompleted();
}
catch (Exception ex)
{
observer.OnError(ex);
}
};
// This handler handle a failure
EventHandler<ExceptionRoutedEventArgs> failedHandler =
(sender, args) => observer.OnError(args.ErrorException);
var url = string.Format("http://graph.facebook.com/{0}/picture/", profileId);
var uri = new Uri(url, UriKind.Absolute);
BitmapImage bmp = null;
try
{
Deployment.Current.Dispatcher.BeginInvoke(
() =>
{
bmp = new BitmapImage();
bmp.ImageOpened += openedHandler;
bmp.ImageFailed += failedHandler;
bmp.CreateOptions = BitmapCreateOptions.None;
bmp.UriSource = uri;
});
}
catch (Exception ex)
{
observer.OnError(ex);
}
return () =>
{
// Cleanup the event handlers
if (bmp != null)
{
bmp.ImageOpened -= openedHandler;
bmp.ImageFailed -= failedHandler;
}
};
});
}
И использование:
GetProfilePhoto("mglace")
.Subscribe(image => { /* Do something with the image in here*/ },
error => { /* Handle any errors in here */ },
() => { /* Finalization code goes here */ });
Я надеюсь, что кто-то найдет это полезным.