我正在为通用Windows平台编写一个应用程序,我需要加载一些图像以显示在列表中。现在我的问题是这个加载对用户来说太长了。我目前使用绑定设置了XAML
中图像的来源,如下所示:{Binding Image}
。
我只能访问全分辨率图像,因此我想知道是否有办法在将这些图像放在UI上之前使这些图像更小,因此只有较小的图像需要保留在内存中。有没有办法配置Image
UI元素,以便它自己执行此大小调整?
此外,有没有办法懒洋洋地加载这些图像,因为现在我的UI被加载这些图像阻止。
编辑:我用来将我的本地图片加载到我的Image
(这是ListView.ItemTemplate
内)的代码:
<Image
Grid.Row="0"
Source="{Binding Image}"
Stretch="Uniform"
VerticalAlignment="Center"/>
答案 0 :(得分:3)
您可以使用转换器延迟加载和调整图像大小。 In是您可以使用的转换器的开始。有了这个,懒人加载就完成了。但是,我没有准备好调整大小示例。
转换代码
class LoadAttachmentAsyncConverter : IValueConverter
{
public override object Convert(object value, Type targetType, object parameter, string language)
{
Task<BitmapImage> taskToExecute = GetImage(<some parameter>);
//Possibly handle some other business logic
return new NotifyTaskCompletion<BitmapImage>(taskToExecute);
}
public async Task<BitmapImage> GetImage(object someParameter) {
BitmapImage image = new BitmapImage();
//do (async stuff) to fill the image;
return image;
}
}
XAML代码
<Image Source="{Binding Result}" DataContext="{Binding converterObjValue, Converter={StaticResource ConverterName}}"/>
要实施调整大小,您可以在此处找到信息:https://social.msdn.microsoft.com/Forums/en-US/490b9c01-db4b-434f-8aff-d5c495e67e55/how-to-crop-an-image-using-bitmaptransform?forum=winappswithcsharp
答案 1 :(得分:1)
您也可以在虚拟机中进行延迟加载。
// You can also use BitmapImage directly, if you'd like to make reloading faster and don't care memory usage.
private WeakReference<BitmapImage> image;
public BitmapImage Image
{
get
{
BitmapImage image;
if(this.image != null && this.image.TryGetTarget(out image))
return image;
image = new BitmapImage();
this.image = new WeakReference<BitmapImage>(image);
var ignore = Task.Run(()=>
{
//Load image here.
//Don't forget to use Dispatcher while calling SetSourceAsync() or setting Source.
});
return image;
}
}