Я работаю над проектом 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 второго изображение пусто ... как получилось?