1

このリンクで非常に便利なクラスを見つけました: images caching - 画像をキャッシュするためのロジックを作成するのに役立ちます。しかし、私の場合、私はこれを持っています:

 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

Web から画像を非同期的に取得していますが、すぐに次の行に移動して、分離ストレージにまだ書き込まれていないファイルを読み取ります。これが例外の原因です。

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 に答える