我有一个ListView,其中包含一个包含我的用户控件的数据模板。此用户控件具有依赖项属性“MyObject
”以及绑定到类型为MyObject
的属性为“AsyncLazy<BitmapImage>
”的Image组件。图像在后台异步下载并返回(同时还调用事件)。调用的事件在我的Image组件上启动动画以淡入并显示下载的图像。
首先按预期执行此操作,但是如果图像在显着不同的时间下载,则动画仍然开始 - 但是在所有图像完成下载之后图像才会显示 - 导致某些图像只是弹出in - 因为在加载动画之前已经为它们启动了淡入淡出。
我更进了一步,为每个用户控件添加了一个方法,它在后台加载一些网站的数据 - 它运行得相当长,所以我只是在用户控件初始化时启动任务,就是这样。任务应该在后台运行,并在完成而等待它时将结果存储到属性“MyObject
”。
但出于某种原因 - 在上述任务完成之前,图像不会开始下载。
<Image x:Name="mainImage" Source="{Binding ImageMedium.Value.Result, IsAsync=True, UpdateSourceTrigger=PropertyChanged}"/>
public AsyncLazy<BitmapImage> ImageMedium { get; }
public List<MyEntry> Entries { get; private set; }
public void Init()
{
MyObject.GetEntries();
// this long-running task should just run in the BG without waiting for it
// ...
}
public async Task GetEntries()
{
var t = await Task.Run(() => Do some work... );
Entries = t; // store result to a MyObject property
}
ImageMedium = new AsyncLazy<BitmapImage>(() =>
{
var data = GetImage(ImageSize.Medium); // normal long-running method
ImageLoaded?.Invoke(data, ImageSize.Medium); // event that starts animation
return data;
});
control.MyObject.ImageLoaded += (img, s) =>
{
// start animation when Image is loaded
control.UIContext.Send(async (a) => {
await Task.Delay(500);
DoubleAnimation dan1 = new DoubleAnimation(1.0, TimeSpan.FromSeconds(0.7));
control.mainImage.BeginAnimation(OpacityProperty, dan1);
}, null);
};
我还尝试实施INotifyPropertyChanged
并将调整与调用事件一起通知 - 但没有解决任何问题。
编辑:经过进一步测试,似乎图像DO在长时间运行的任务完成之前开始下载 - 但下载在实际开始之前延迟了大约20-30秒。