WPF MVVM - источник изображения пуст, хотя я установил его в ctor ViewModel - PullRequest
0 голосов
/ 23 марта 2020

Я работаю над проектом MVFM WPF на работе.

Я пытаюсь загрузить изображение в ctor ViewModel в течение определенного промежутка времени.

В случае успеха - отобразить окно с предварительно загруженным изображением, в случае неудачи я задаю URL-адрес другого элемента управления изображением для загрузки WPF после появления окна.

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

Вот мой viewModel:

    public BitmapImage ImageSource { get; set; }
    public string ImageUrl { get; set; }
    public VM1()
    {
        _log.Info("Starting");
        GetImageSourceOrUrl(@"https://images-cdn.9gag.com/photo/aBxzjdx_460s.jpg", 100);
        _log.Info("displaying window");       
    }

    private void GetImageSourceOrUrl(string url, int timeout)
    {
        ImageUrl = url;
        var getImageBitmapTask = GetImageBitmapTask(url);
        getImageBitmapTask.Wait(timeout); //wait until timeout or image load
        if (getImageBitmapTask.IsCompleted)
        {
            ImageSource = getImageBitmapTask.Result;
            _log.Info($"image from Bitmap");
        }
        else
        {
            _log.Warn($"image from URL {ImageUrl}");
        }
    }

    private Task<BitmapImage> GetImageBitmapTask(string imageUrl)
    {
        var tcs = new TaskCompletionSource<BitmapImage>();
        Task.Run(() =>
        {
            _log.Info("trying to download the image");
            var bitmapImage = new BitmapImage(new Uri(imageUrl));
            if (bitmapImage.IsDownloading)
            {
                bitmapImage.DownloadCompleted += (s, e) =>
                {
                    _log.Info("finished downloading");
                    bitmapImage.Freeze();
                    tcs.TrySetResult(bitmapImage);
                };
            }
            else
            {
                _log.Info("already have the image");
                bitmapImage.Freeze();
                tcs.TrySetResult(bitmapImage);
            }
            Dispatcher.Run(); //keep this thread alive
        });
        return tcs.Task;
    }

И XAML:

<Grid>
    <Image HorizontalAlignment="Left" Height="207" Margin="339,167,0,0" VerticalAlignment="Top" Width="359"
           Source="{Binding ImageSource}" 
           Visibility="{Binding Path=ImageSource, Converter={StaticResource NullToVisibilityConverter}}"/>
    <Image HorizontalAlignment="Left" Height="207" Margin="339,167,0,0" VerticalAlignment="Top" Width="359"
           Source="{Binding ImageUrl}" 
           Visibility="{Binding Path=ImageUrl, Converter={StaticResource StringToVisibilityConverter}}"/>
</Grid>

Я сталкиваюсь с двумя проблемами:
1. Почему журнал «окна отображения» появляется до появления «изображения из растрового изображения», независимо от параметра времени ожидания? не Task.Wait предполагает блокировать?
2. Как вы видите, я использую конвертеры в XAML. они работают нормально (не хотел перегружать вопрос), и когда я отлаживаю его, я вижу, что задан URL-адрес второго элемента управления изображением.
Однако, с Sn oop, свойство Source второго изображение пусто ... как получилось?

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