在Windows RT应用程序中预加载图像

时间:2014-03-10 20:06:36

标签: c# vb.net windows-store-apps

我在Windows RT上运行了一个Windows应用商店应用,其中包含一个图像列表框。有很多这样的,所以当第一次加载它们时,绘画过程非常明显。我知道在场景后面有一个缓存机制,我想用它来预加载列表顶部的前几个图像,以便列表立即出现。

有办法吗?

2 个答案:

答案 0 :(得分:1)

我找到了解决方案。

IRandomAccessStream stream = await storageFile.OpenAsync(FileAccessMode.Read);
BitmapImage bitmapImage = new BitmapImage();
if (await bitmapImage.SetSourceAsync(stream))
{
    image1.source = bitmapImage;
}

这种方式没有闪烁。

答案 1 :(得分:1)

让它工作,这就是我做到的。我创建了一个Dictionary<string, BitmapImage>来存储预先发布的图片并在app start上加载它。还创建了一个函数,该函数接受路径并从字​​典中返回预加载的图像(如果存在),或者如果不存在则正常加载它。

private Dictionary<string, BitmapImage> preload;
.
.
.


public void PreloadImages(BaseUri, path)
{
    if (!preload.ContainsKey(path))
    {
        var uri = new Uri(BaseUri, path);
        var file = await StorageFile.GetFileFromApplicationUriAsync(uri);

        IRandomAccessStream fileStream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read);
        BitmapImage bmp = new BitmapImage();
        if (!preload.ContainsKey(path))
            preload.Add(path, bmp);
    }
}
public BitmapImage ImageFromRelativePath(Uri BaseUri, string path)
{
    if (preload.ContainsKey(path))
    {
        return preload[path];
    }
    else
    {
        var uri = new Uri(BaseUri, path);
        BitmapImage bmp = new BitmapImage();
        bmp.UriSource = uri;
        return bmp;
    }
}

然后我使用了一个转换器用于Xaml绑定。

public sealed class CachedImageConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {            
        var path = value as string;
        if (path == null)
            return null;
        var app = App.Current as App;
        return app.ImageHelper.ImageFromRelativePath(new Uri("ms-appx:/"), path);
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

转换器正在运行:

<Image Source="{Binding Path=ImagePath, Mode=OneWay, Converter={StaticResource CachedImageConverter}}"></Image>