У меня есть приложение WPF с UserControl
под названием MyBook, которое при загрузке запускает фоновый поток, чтобы получить список объектов домена, каждый из которых содержит URL-адрес изображения Azure, размещенного в хранилище больших двоичных объектов.
Для каждого возвращаемого объекта домена я добавляю новый экземпляр пользовательского элемента управления с именем LazyImageControl
, который будет загружать изображение из Azure в фоновом режиме и отображать его, когда все будет готово.
Это прекрасно работает, но когда я добавляю второй элемент управления MyBook к сцене, изображения по какой-то причине не загружаются, я не могу понять, почему это так.
Вот код для LazyImageControl
public LazyImageControl()
{
InitializeComponent();
DataContextChanged += ContextHasChanged;
}
private void ContextHasChanged(object sender, DependencyPropertyChangedEventArgs e)
{
// Start a thread to download the bitmap...
_uiThreadDispatcher = Dispatcher.CurrentDispatcher;
new Thread(WorkerThread).Start(DataContext);
}
private void WorkerThread(object arg)
{
var imageUrlString = arg as string;
string url = imageUrlString;
var uriSource = new Uri(url);
BitmapImage bi;
if (uriSource.IsFile)
{
bi = new BitmapImage(uriSource);
bi.Freeze();
_uiThreadDispatcher.Invoke(DispatcherPriority.Send, new DispatcherOperationCallback(SetBitmap), bi);
}
else
{
bi = new BitmapImage();
// Start downloading the bitmap...
bi.BeginInit();
bi.UriSource = uriSource;
bi.UriCachePolicy = new RequestCachePolicy(RequestCacheLevel.Default);
bi.DownloadCompleted += DownloadCompleted;
bi.DownloadFailed += DownloadFailed;
bi.EndInit();
}
// Spin waiting for the bitmap to finish loading...
Dispatcher.Run();
}
private void DownloadFailed(object sender, ExceptionEventArgs e)
{
throw new NotImplementedException();
}
private void DownloadCompleted(object sender, EventArgs e)
{
// The bitmap has been downloaded. Freeze the BitmapImage
// instance so we can hand it back to the UI thread.
var bi = (BitmapImage)sender;
bi.Freeze();
// Hand the bitmap back to the UI thread.
_uiThreadDispatcher.Invoke(DispatcherPriority.Send, new DispatcherOperationCallback(SetBitmap), bi);
// Exit the loop we are spinning in...
Dispatcher.CurrentDispatcher.InvokeShutdown();
}
private object SetBitmap(object arg)
{
LazyImage.Source = (BitmapImage)arg;
return null;
}
Итак, проблема в том, что после первого запуска WorkerThread все работает нормально, но я никогда не получаю обратный вызов методов DownloadCompleted
или DownloadFailed
, и я понятия не имею, почему ...
Есть идеи?