Изображения не загружаются при второй загрузке в WPF - PullRequest
2 голосов
/ 13 февраля 2011

У меня есть приложение 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, и я понятия не имею, почему ...

Есть идеи?

1 Ответ

1 голос
/ 13 февраля 2011

Не уверен, но, возможно, вам следует попробовать подключить обработчики событий DownloadCompleted и DownloadFailed перед установкой BitmapImage.UriSource, которая должна инициировать загрузку изображения, так что, возможно, оно загружается до того, как ваши обработчики событий были присоединено (не в первый раз, потому что загрузка занимает некоторое время, но затем изображение кэшируется и будет загружено немедленно)

Также: От какого класса наследуется LazyImageControl, чтобы я мог проверить его, если это не так?

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