1

我在这个链接上找到了一个非常有用的类:图像缓存——它帮助我制定缓存图像的逻辑。但就我而言,我有这个:

 private void DetailView_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                                   SaveAndLoadImage(feedItem);


            }

在这种方法中,我从独立存储中保存和加载图像。但是由于某些权限(IsolatedStorageFileStream 上不允许操作),我无法立即加载文件。如何更正我的逻辑以立即保存和加载图像?

  public void SaveAndLoadImage(MediaItemViewModel curItem)
            {
                string url = string.Empty;
                if (!string.IsNullOrEmpty(curItem.ThumbUrl))
                {
                    url = curItem.ThumbUrl;
                }
                if ((string.IsNullOrEmpty(curItem.ThumbUrl)) && (!string.IsNullOrEmpty(curItem.MediaUrl)))
                {
                    url = curItem.MediaUrl;
                }
                if ((!string.IsNullOrEmpty(url)) && (CacheImageFile.GetInstance().IsOnStorage(new Uri(url)) == false))
                {
                    CacheImageFile.DownloadFromWeb(new Uri(url));

                }

                    curItem.ImageSource = CacheImageFile.ExtractFromLocalStorage(new Uri(url)) as BitmapImage;

            }
4

3 回答 3

3

看看下面的链接

http://www.windowsphonegeek.com/tips/All-about-WP7-Isolated-Storage---Read-and-Save-Images

用于从隔离存储加载图像。使用流

BitmapImage bi = new BitmapImage();

            using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
            {
                using (IsolatedStorageFileStream fileStream = myIsolatedStorage.OpenFile("logo.jpg", FileMode.Open, FileAccess.Read))
                {
                    bi.SetSource(fileStream);
                    this.img.Height = bi.PixelHeight;
                    this.img.Width = bi.PixelWidth;
                }
            }
            this.img.Source = bi;
于 2012-07-16T08:04:35.143 回答
1

您可以使用JetImageLoader,我为应用程序创建了它,我们需要在其中加载、缓存和显示大量徽标、图标等。

它可以用作绑定转换器,因此您甚至不应该更改您的代码!只需更新您的 XAML!

请查看存储库中的示例,您会喜欢的;)

特征:

  • 缓存在磁盘上
  • 缓存在内存中
  • 完全异步
  • 可用作绑定转换器或以编程方式从您的代码中使用
  • 完全开源,分叉和改进它!

这是示例:

<Image Source="{Binding ImageUrl, Converter={StaticResource MyAppJetImageLoaderConverter}}"/>

PS我很抱歉,我从另一个问题中复制了我的答案,但是Windows手机上的图像缓存是个大问题,我想分享我的解决方案,所以每个人都可以使用它并为开发者社区改进

于 2013-10-12T23:01:49.867 回答
1

您正在从网络异步获取图像,但立即转到下一行以读取甚至尚未写入隔离存储的文件。这就是导致您异常的原因。

您可以尝试使用 ManualResetEvent 编辑您在 github 上找到的缓存库。请注意,您将不得不在另一个线程上进行方法调用!

例如:

public class CacheImageFileConverter : IValueConverter
{
    ...
    private static ManualResetEvent mre = new ManualResetEvent(true);

    private static object DownloadFromWeb(Uri imageFileUri)
    {
        mre.Reset();
        WebClient m_webClient = new WebClient();                                //Load from internet
        BitmapImage bm = new BitmapImage();

        m_webClient.OpenReadCompleted += (o, e) =>
        {
            if (e.Error != null || e.Cancelled) return;
            WriteToIsolatedStorage(IsolatedStorageFile.GetUserStoreForApplication(), e.Result, GetFileNameInIsolatedStorage(imageFileUri));
            bm.SetSource(e.Result);
            e.Result.Close();
            mre.Set();
        };
        m_webClient.OpenReadAsync(imageFileUri);
        return bm;
    }

    private static object ExtractFromLocalStorage(Uri imageFileUri)
    {
        mre.WaitOne();
        string isolatedStoragePath = GetFileNameInIsolatedStorage(imageFileUri);       //Load from local storage
        using (var sourceFile = _storage.OpenFile(isolatedStoragePath, FileMode.Open, FileAccess.Read))
        {
            BitmapImage bm = new BitmapImage();
            bm.SetSource(sourceFile);
            return bm;
        }
    }
    .... other methods
}

请注意使用 Reset、Set 和 WaitOne 来发送信号。

于 2012-07-16T08:15:03.037 回答